* Feature Request [ 1614535 ]

- Beta release for developer testing
This commit is contained in:
Heng Sin Low 2006-12-17 15:41:06 +00:00
parent 145b27f48c
commit 7c8eb551ae
178 changed files with 31477 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
lib.dir=../lib
schemaoutputfile=../adempiere-model.xml
schemafiles=adempiere-model.xml
datafile=../adempiere-data.xml
sqloutputfile=adempiere-schema.sql
fkoutputfile=adempiere-fk.sql
alterdatabase=false
delimitedsqlidentifiers=true

View File

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<project default="writeSchemaSqlToFile" name="DdlUtils" basedir=".">
<!-- Allow values set at the commandline or in the environment to override the defaults -->
<property environment="env" />
<!-- Load the jdbc properties as specified by the jdbc.properties.file variable-->
<property file="jdbc.properties.fyracle" />
<!-- Load the build properties -->
<property file="build-ddl.properties" />
<!-- These properties can be overriden on the commandline using -D -->
<property name="catalogpattern" value="" />
<property name="schemapattern" value="${ddlutils.schema}" />
<property name="platform" value="${ddlutils.platform}" />
<property name="alterdatabase" value="false" />
<!-- The classpath used for running the tasks -->
<path id="project-classpath">
<fileset dir="${lib.dir}">
<include name="**/*.jar" />
<include name="**/*.zip" />
</fileset>
</path>
<taskdef classname="org.apache.ddlutils.task.DdlToDatabaseTask" name="ddlToDatabase" classpathref="project-classpath" />
<taskdef classname="org.apache.ddlutils.task.DatabaseToDdlTask" name="databaseToDdl" classpathref="project-classpath" />
<target name="createDb">
<ddlToDatabase usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<createdatabase failonerror="false" />
</ddlToDatabase>
</target>
<target name="writeSchemaToDb">
<ddlToDatabase validatexml="false" usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<fileset dir="..">
<include name="${schemafiles}" />
</fileset>
<writeschematodatabase alterdatabase="${alterdatabase}" dodrops="false" failonerror="false" />
</ddlToDatabase>
</target>
<target name="writeSchemaSqlToFile">
<ddlToDatabase validatexml="false" usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<fileset dir="..">
<include name="${schemafiles}" />
</fileset>
<writeschemasqltofile alterdatabase="${alterdatabase}" dodrops="false" failonerror="false" createtables="true" createforeignkeys="false" outputfile="${sqloutputfile}" />
</ddlToDatabase>
</target>
<target name="writeFkSqlToFile">
<ddlToDatabase validatexml="false" usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<fileset dir="..">
<include name="${schemafiles}" />
</fileset>
<writeschemasqltofile alterdatabase="${alterdatabase}" dodrops="false" failonerror="false" createtables="false" createforeignkeys="true" outputfile="${fkoutputfile}" />
</ddlToDatabase>
</target>
<target name="writeSchemaToFile">
<databaseToDdl usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<writeSchemaToFile outputfile="${schemaoutputfile}" />
</databaseToDdl>
</target>
<target name="writeDataToFile">
<databaseToDdl usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<writeDataToFile outputfile="${datafile}" />
</databaseToDdl>
</target>
<target name="writeDataToDb">
<ddlToDatabase usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<fileset dir="..">
<include name="${schemafiles}" />
</fileset>
<writedatatodatabase datafile="${datafile}" usebatchmode="false" ensureForeignKeyOrder="false" />
</ddlToDatabase>
</target>
</project>

View File

@ -0,0 +1,9 @@
fyracle.home=c:/Program Files/fyracle-0.8.10
fyracle.database=${basedir}/adempiere.fdb
fyracle.user=sysdba
fyracle.password=masterkey
#it can be deployed locally only now
fyracle.host=localhost
fyracle.port=3050

View File

@ -0,0 +1,125 @@
<project name="export-data" default="create" basedir=".">
<property file="build.properties" />
<path id="lib.path">
<fileset dir="../lib">
<include name="**/*.jar" />
</fileset>
</path>
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<fileset dir="../lib">
<include name="**/*.jar" />
</fileset>
</classpath>
</taskdef>
<target name="create" depends="init,create-database,load-init,create-schema,load-data,load-functions,load-others">
</target>
<target name="init">
<echo message="============================================================" />
<echo message=" Fyracle database transfer tool for Compiere ERP" />
<echo message=" Jotel sp.j. http://www.jotel.com.pl/compiere-port" />
<echo message=" Open Business Solutions" />
<echo message=" This util license is GNU GPL License" />
<echo message=" Adempiere Licese is GNU GPL License" />
<echo message="============================================================" />
<echo message="" file="log/plsql.log" append="false" />
<echo append="false" file="log/build.log" message="#Build log:${line.separator}${line.separator}" />
</target>
<target name="create-database">
<!-- make backup just in case -->
<move file="${fyracle.database}" tofile="backup/adempiere.fdb" failonerror="false" />
<copy file="template.fdb" tofile="${fyracle.database}" />
</target>
<target name="load-init">
<echo file="log/plsql.log" append="true" message="${line.separator}#Load init.sql:${line.separator}${line.separator}" />
<antcall target="load">
<param name="file.name" value="${basedir}/init.sql" />
</antcall>
</target>
<target name="create-schema">
<echo message="----- Creating tables -----" />
<ant antfile="build-ddl.xml" target="writeSchemaSqlToFile" />
<antcall target="load">
<param name="file.name" value="${basedir}/adempiere-schema.sql" />
</antcall>
</target>
<target name="load-functions">
<echo file="log/plsql.log" append="true" message="${line.separator}#Create Functions:${line.separator}${line.separator}" />
<foreach param="file.name" target="load">
<path>
<fileset dir="../oracle/functions">
<include name="**" />
</fileset>
</path>
</foreach>
<echo file="log/plsql.log" append="true" message="${line.separator}#Create Procedures:${line.separator}${line.separator}" />
<foreach param="file.name" target="load">
<path>
<fileset dir="../oracle/procedures">
<include name="**" />
</fileset>
</path>
</foreach>
</target>
<target name="load-data">
<echo message="----- Loading Adempiere Seed data -----" />
<unjar src="../adempiere-data.jar" dest=".." />
<ant antfile="build-ddl.xml" target="writeDataToDb" />
<delete file="../adempiere-data.xml" />
</target>
<target name="load-others">
<echo message="----- Loading other database object -----" />
<echo file="log/plsql.log" append="true" message="${line.separator}#Create Temporary Tables:${line.separator}${line.separator}" />
<antcall target="load">
<param name="file.name" value="${basedir}/temptables.sql" />
</antcall>
<echo file="log/plsql.log" append="true" message="${line.separator}#Create Views [1st Pass]:${line.separator}${line.separator}" />
<foreach param="file.name" target="load">
<path>
<fileset dir="../views">
<include name="**" />
</fileset>
</path>
</foreach>
<echo file="log/plsql.log" append="true" message="${line.separator}#Create Views [2nd Pass]:${line.separator}${line.separator}" />
<foreach param="file.name" target="load">
<path>
<fileset dir="../views">
<include name="**" />
</fileset>
</path>
</foreach>
<echo file="log/plsql.log" append="true" message="${line.separator}#Create Sequences:${line.separator}${line.separator}" />
<foreach param="file.name" target="load">
<path>
<fileset dir="../sequences">
<include name="**" />
</fileset>
</path>
</foreach>
<ant antfile="build-ddl.xml" target="writeFkSqlToFile" />
<echo file="log/plsql.log" append="true" message="${line.separator}#Create Foreign Keys:${line.separator}${line.separator}" />
<antcall target="load">
<param name="file.name" value="${basedir}/adempiere-fk.sql" />
</antcall>
</target>
<target name="load">
<echo message="Loading file ${file.name}" />
<exec dir="${fyracle.home}\bin" executable="${fyracle.home}/bin/plsql" resultproperty="plsql.result" output="log/plsql.log" append="true">
<arg value="${fyracle.database}" />
<arg value="${file.name}" />
</exec>
<echo message="File ${file.name} status ${plsql.result}" />
<echo append="true" file="log/build.log">File ${file.name} status ${plsql.result}</echo>
<echo append="true" file="log/build.log" message="${line.separator}" />
</target>
</project>

View File

@ -0,0 +1,55 @@
/** Get Character at Position */
CREATE OR REPLACE FUNCTION charAt
(
p_string VARCHAR2,
p_pos NUMBER
)
RETURN VARCHAR2
AS
BEGIN
RETURN SUBSTR(p_string, p_pos, 1);
END;
/
/** GetDate */
CREATE OR REPLACE FUNCTION getdate
RETURN DATE
AS
BEGIN
RETURN SysDate;
END;
/
/** First Of DD/DY/MM/Q */
CREATE OR REPLACE FUNCTION firstOf
(
p_date DATE,
p_datePart VARCHAR2
)
RETURN DATE
AS
BEGIN
RETURN TRUNC(p_date, p_datePart);
END;
/
/** Add Number of Days */
CREATE OR REPLACE FUNCTION addDays
(
p_date DATE,
p_days NUMBER
)
RETURN DATE
AS
BEGIN
RETURN TRUNC(p_date) + p_days;
END;
/
CREATE OR REPLACE FUNCTION daysBetween
(
p_date1 DATE,
p_date2 DATE
)
RETURN NUMBER
AS
BEGIN
RETURN (TRUNC(p_date1) - TRUNC(p_date2));
END;
/

View File

@ -0,0 +1,20 @@
# JDBC properties for Fyracle
# Note: Properties starting with "datasource." will be fed into the datasource instance of the
# class configured via the datasource.class property
# Use this property to choose the Oracle9 platform (instead of the Oracle8 default one)
ddlutils.platform=Oracle9
#
# Using the plain DBCP datasource
#
datasource.class=org.apache.commons.dbcp.BasicDataSource
datasource.driverClassName=org.firebirdsql.jdbc.FBDriver
datasource.url=jdbc:firebirdsql:oracle:localhost/3050:${basedir}/adempiere.fdb
datasource.username=sysdba
datasource.password=masterkey
# For oracle, we should limit the schema to the one of the user
# Note that Oracle requires this to be uppercase, even when using delimited identifiers
ddlutils.schema=ADEMPIERE

View File

@ -0,0 +1,2 @@
Folder to store log generated from build

Binary file not shown.

View File

@ -0,0 +1,20 @@
DROP TABLE T_Selection CASCADE CONSTRAINTS;
CREATE GLOBAL TEMPORARY TABLE T_Selection
(
T_Selection_ID NUMBER(10, 0) NOT NULL
CONSTRAINT T_Selection_Key PRIMARY KEY
)
ON COMMIT DELETE ROWS;
DROP TABLE T_Selection2;
CREATE GLOBAL TEMPORARY TABLE T_Selection2
(
Query_ID NUMBER NOT NULL,
T_Selection_ID NUMBER(10) NOT NULL,
CONSTRAINT T_Selection2_Key PRIMARY KEY (Query_ID,T_Selection_ID)
)
ON COMMIT PRESERVE ROWS;

View File

@ -0,0 +1,112 @@
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: AfterImport.sql,v 1.2 2006/05/28 22:52:07 jjanke Exp $
***
* Title: After Import
* Description:
* - General Info
* - Create Context
* - Check Imported User and list ivalid objects
* You can ignore import warnings as long as this does not
* return error messages or records.
************************************************************************/
SELECT 'DB_Name=' || SYS_CONTEXT('USERENV', 'DB_NAME')
|| ', Language=' || SYS_CONTEXT('USERENV', 'LANGUAGE')
|| ', Host=' || SYS_CONTEXT('USERENV', 'HOST')
|| ', IP=' || SYS_CONTEXT('USERENV', 'IP_ADDRESS')
|| ', User=' || SYS_CONTEXT('USERENV', 'CURRENT_USER')
|| ', ID=' || SYS_CONTEXT('USERENV', 'CURRENT_USERID')
|| ', Session=' || SYS_CONTEXT('USERENV', 'SESSIONID')
AS "DBInfo"
FROM DUAL
/
SET serveroutput ON
-- Recompile invalids
BEGIN
DBA_Cleanup();
DBA_AfterImport;
-- DBA_Recompile(NULL); -- called in DBA_AfterImport
END;
/
-- Correct DataFile sizing
DECLARE
CURSOR Cur_TS IS
SELECT FILE_NAME, Tablespace_Name, Bytes/1024/1024 as MB
FROM DBA_DATA_FILES
WHERE (TABLESPACE_NAME='USERS' AND BYTES < 100*1024*1024)
OR (TABLESPACE_NAME='INDX' AND BYTES < 100*1024*1024)
OR (TABLESPACE_NAME='TEMP' AND BYTES < 100*1024*1024);
v_CMD VARCHAR2(300);
BEGIN
FOR ts IN Cur_TS LOOP
DBMS_OUTPUT.PUT_LINE('Resize:');
v_CMD := 'ALTER DATABASE DATAFILE ''' || ts.FILE_NAME
|| ''' RESIZE 100M';
DBMS_OUTPUT.PUT_LINE(' executing: ' || v_CMD);
EXECUTE IMMEDIATE v_CMD;
v_CMD := 'ALTER DATABASE DATAFILE ''' || ts.FILE_NAME
|| ''' AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED';
DBMS_OUTPUT.PUT_LINE(' executing: ' || v_CMD);
EXECUTE IMMEDIATE v_CMD;
END LOOP;
END;
/
/** Database Sizing
** Oracle 10g should use Automatic Shared Memory Management -
** Example 300MB
*
* ALTER SYSTEM documentation
http://download-east.oracle.com/docs/cd/B14117_01/server.101/b10759/statements_2013.htm#SQLRF00902
*
SELECT Name, Value, Description, IsDefault FROM v$parameter
WHERE Name LIKE '%cursor%' OR Name LIKE '%process%' OR NAME LIKE '%servers%' ORDER BY 1
/
SELECT Name, Value/1024/1024 "MB", Description, IsDefault, Update_Comment FROM v$parameter
WHERE Name LIKE '%_pool_size' OR Name LIKE 'sga%'
/
ALTER SYSTEM SET statistics_level = TYPICAL Comment='Adempiere' SCOPE=BOTH
/
ALTER SYSTEM SET sga_target = 314572800 Comment='Adempiere' SCOPE=BOTH
/
ALTER SYSTEM SET open_cursors = 900 Comment='Adempiere' SCOPE=BOTH
/
/** Oracle 9i needs to set explicitly (and restart)
** Example 300MB
ALTER SYSTEM SET sga_max_size=314572800 SCOPE=SPFILE
/
ALTER SYSTEM SET large_pool_size=33554432 SCOPE=SPFILE
/
ALTER SYSTEM SET java_pool_size=67108864 SCOPE=SPFILE
/
/** SELECT 32*1024*1024 FROM DUAL **/
-- Any invalids
SELECT Object_Type "Type", Object_Name "Invalid", Status
FROM User_Objects
WHERE Status <> 'VALID'
/
-- Trigger Info
SELECT Trigger_Name AS Trigger_NotEnabled, Status
FROM User_Triggers
WHERE Status != 'ENABLED'
/
-- Constraint Info
SELECT Constraint_Name AS Constraint_Problem, Status, Validated, Table_Name, Search_Condition, R_Constraint_Name
FROM User_Constraints
WHERE Status <> 'ENABLED' OR Validated <> 'VALIDATED'
/
SELECT *
FROM USER_ERRORS
/
COMMIT
/
EXIT

View File

@ -0,0 +1,8 @@
lib.dir=../lib
schemaoutputfile=../adempiere-model.xml
schemafiles=adempiere-model.xml
datafile=../adempiere-data.xml
sqloutputfile=adempiere-schema.sql
fkoutputfile=adempiere-fk.sql
alterdatabase=false
delimitedsqlidentifiers=true

View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<project default="writeSchemaSqlToFile" name="DdlUtils" basedir=".">
<!-- Allow values set at the commandline or in the environment to override the defaults -->
<property environment="env" />
<!-- Load the jdbc properties as specified by the jdbc.properties.file variable-->
<property file="jdbc.properties.oracle10" />
<!-- Load the build properties -->
<property file="build-ddl.properties" />
<!-- These properties can be overriden on the commandline using -D -->
<property name="catalogpattern" value="" />
<property name="schemapattern" value="${ddlutils.schema}" />
<property name="platform" value="${ddlutils.platform}" />
<!-- The classpath used for running the tasks -->
<path id="project-classpath">
<fileset dir="${lib.dir}">
<include name="**/*.jar" />
<include name="**/*.zip" />
</fileset>
</path>
<taskdef classname="org.apache.ddlutils.task.DdlToDatabaseTask" name="ddlToDatabase" classpathref="project-classpath" />
<taskdef classname="org.apache.ddlutils.task.DatabaseToDdlTask" name="databaseToDdl" classpathref="project-classpath" />
<target name="writeSchemaToDb">
<ddlToDatabase validatexml="false" usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<fileset dir="..">
<include name="${schemafiles}" />
</fileset>
<writeschematodatabase alterdatabase="${alterdatabase}" dodrops="false" failonerror="false" />
</ddlToDatabase>
</target>
<target name="writeSchemaSqlToFile">
<ddlToDatabase validatexml="false" usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<fileset dir="..">
<include name="${schemafiles}" />
</fileset>
<writeschemasqltofile alterdatabase="${alterdatabase}" dodrops="false" failonerror="false" createtables="true" createforeignkeys="false" outputfile="${sqloutputfile}" />
</ddlToDatabase>
</target>
<target name="writeFkSqlToFile">
<ddlToDatabase validatexml="false" usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<fileset dir="..">
<include name="${schemafiles}" />
</fileset>
<writeschemasqltofile alterdatabase="${alterdatabase}" dodrops="false" failonerror="false" createtables="false" createforeignkeys="true" outputfile="${fkoutputfile}" />
</ddlToDatabase>
</target>
<target name="writeSchemaToFile">
<databaseToDdl usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<writeSchemaToFile outputfile="${schemaoutputfile}" />
</databaseToDdl>
</target>
<target name="writeDataToFile">
<databaseToDdl usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<writeDataToFile outputfile="${datafile}" />
</databaseToDdl>
</target>
<target name="writeDataToDb">
<ddlToDatabase usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<fileset dir="..">
<include name="${schemafiles}" />
</fileset>
<writedatatodatabase datafile="${datafile}" usebatchmode="false" ensureForeignKeyOrder="false" />
</ddlToDatabase>
</target>
</project>

View File

@ -0,0 +1,4 @@
oracle.home=C:/oracle/product/10.2.0/db_1
oracle.connect.param=adempiere/adempiere@orcl

View File

@ -0,0 +1,122 @@
<project name="create-db" default="create" basedir=".">
<property file="build.properties" />
<path id="lib.path">
<fileset dir="../lib">
<include name="**/*.jar" />
</fileset>
</path>
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<fileset dir="../lib">
<include name="**/*.jar" />
</fileset>
</classpath>
</taskdef>
<target name="create" depends="init,load-functions,create-schema,load-data,load-others">
</target>
<target name="init">
<echo message="============================================================" />
<echo message=" Oracle database create tool for Adempiere ERP" />
<echo message=" Adempiere Licese is GNU GPL License" />
<echo message="============================================================" />
<echo message="" file="log/sqlplus.log" append="false" />
<echo append="false" file="log/build.log" message="#Build log:${line.separator}${line.separator}" />
</target>
<target name="create-schema">
<echo message="----- Creating tables -----" />
<ant antfile="build-ddl.xml" target="writeSchemaSqlToFile" />
<echo file="log/sqlplus.log" append="true" message="${line.separator}#Create Tables:${line.separator}${line.separator}" />
<antcall target="load">
<param name="file.name" value="${basedir}/adempiere-schema.sql" />
</antcall>
</target>
<target name="load-data">
<echo message="----- Loading Adempiere Seed data -----" />
<unjar src="../adempiere-data.jar" dest=".." />
<ant antfile="build-ddl.xml" target="writeDataToDb" />
<delete file="../adempiere-data.xml" />
</target>
<target name="load-functions">
<echo file="log/sqlplus.log" append="true" message="${line.separator}#Create Functions:${line.separator}${line.separator}" />
<antcall target="load">
<param name="file.name" value="${basedir}/init.sql" />
</antcall>
<foreach param="file.name" target="load">
<path>
<fileset dir="functions">
<include name="**" />
</fileset>
</path>
</foreach>
<echo file="log/sqlplus.log" append="true" message="${line.separator}#Create Procedures:${line.separator}${line.separator}" />
<foreach param="file.name" target="load">
<path>
<fileset dir="procedures">
<include name="**" />
</fileset>
</path>
</foreach>
</target>
<target name="load-others">
<echo message="----- Loading other database objects -----" />
<echo file="log/sqlplus.log" append="true" message="${line.separator}#Create Temporary Tables:${line.separator}${line.separator}" />
<antcall target="load">
<param name="file.name" value="${basedir}/temptables.sql" />
</antcall>
<echo file="log/sqlplus.log" append="true" message="${line.separator}#Create Views [1st Pass]:${line.separator}${line.separator}" />
<foreach param="file.name" target="load">
<path>
<fileset dir="../views">
<include name="**" />
</fileset>
</path>
</foreach>
<echo file="log/sqlplus.log" append="true" message="${line.separator}#Create Views [2nd Pass]:${line.separator}${line.separator}" />
<foreach param="file.name" target="load">
<path>
<fileset dir="../views">
<include name="**" />
</fileset>
</path>
</foreach>
<echo file="log/sqlplus.log" append="true" message="${line.separator}#Create Sequences:${line.separator}${line.separator}" />
<foreach param="file.name" target="load">
<path>
<fileset dir="../sequences">
<include name="**" />
</fileset>
</path>
</foreach>
<ant antfile="build-ddl.xml" target="writeFkSqlToFile" />
<echo file="log/sqlplus.log" append="true" message="${line.separator}#Create Foreign Keys:${line.separator}${line.separator}" />
<antcall target="load">
<param name="file.name" value="${basedir}/adempiere-fk.sql" />
</antcall>
<echo file="log/sqlplus.log" append="true" message="${line.separator}#Cleanup and Recompile:${line.separator}${line.separator}" />
<antcall target="load">
<param name="file.name" value="${basedir}/AfterImport.sql" />
</antcall>
</target>
<target name="load">
<echo message="Loading file ${file.name}" />
<exec dir="${oracle.home}/bin" executable="${oracle.home}/bin/sqlplus" resultproperty="sqlplus.result" output="log/sqlplus.log" append="true">
<arg line="${oracle.connect.param}" />
<arg line="@${file.name}" />
</exec>
<echo message="File ${file.name} status ${sqlplus.result}" />
<echo append="true" file="log/build.log">File ${file.name} status ${sqlplus.result}</echo>
<echo append="true" file="log/build.log" message="${line.separator}" />
</target>
</project>

View File

@ -0,0 +1,64 @@
CREATE OR REPLACE FUNCTION acctBalance
(
p_Account_ID IN NUMBER,
p_AmtDr IN NUMBER,
p_AmtCr IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2004 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: Acct_Balance.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Aclculate Balance based on Account Sign + Type
* Description:
* If an account is specified and found
* - If the account sign is Natural it sets it based on Account Type
* Returns Credit or Debit Balance
* Test:
SELECT Acct_Balance (0,11,22) FROM DUAL
SELECT AccountType, AccountSign,
Acct_Balance(C_ElementValue_ID, 20, 10) "DR Balance",
Acct_Balance(C_ElementValue_ID, 10, 20) "CR Balance"
FROM C_ElementValue
WHERE AccountSign<>'N'
ORDER BY AccountSign
************************************************************************/
AS
v_balance NUMBER;
v_AccountType C_ElementValue.AccountType%TYPE;
v_AccountSign C_ElementValue.AccountSign%TYPE;
BEGIN
v_balance := p_AmtDr - p_AmtCr;
--
IF (p_Account_ID > 0) THEN
SELECT AccountType, AccountSign
INTO v_AccountType, v_AccountSign
FROM C_ElementValue
WHERE C_ElementValue_ID=p_Account_ID;
-- DBMS_OUTPUT.PUT_LINE('Type=' || v_AccountType || ' - Sign=' || v_AccountSign);
-- Natural Account Sign
IF (v_AccountSign='N') THEN
IF (v_AccountType IN ('A','E')) THEN
v_AccountSign := 'D';
ELSE
v_AccountSign := 'C';
END IF;
-- DBMS_OUTPUT.PUT_LINE('Type=' || v_AccountType || ' - Sign=' || v_AccountSign);
END IF;
-- Debit Balance
IF (v_AccountSign = 'C') THEN
v_balance := p_AmtCr - p_AmtDr;
END IF;
END IF;
--
RETURN v_balance;
EXCEPTION WHEN OTHERS THEN
-- In case Acct not found
RETURN p_AmtDr - p_AmtCr;
END acctBalance;
/

View File

@ -0,0 +1,48 @@
CREATE OR REPLACE FUNCTION bomPriceLimit
(
Product_ID IN NUMBER,
PriceList_Version_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2002 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: BOM_PriceLimit.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Return Limit Price of Product/BOM
* Description:
* if not found: 0
************************************************************************/
AS
v_Price NUMBER;
v_ProductPrice NUMBER;
-- Get BOM Product info
CURSOR CUR_BOM IS
SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM
FROM M_Product_BOM b, M_Product p
WHERE b.M_ProductBOM_ID=p.M_Product_ID
AND b.M_Product_ID=Product_ID;
--
BEGIN
-- Try to get price from PriceList directly
SELECT COALESCE (SUM(PriceLimit), 0)
INTO v_Price
FROM M_ProductPrice
WHERE M_PriceList_Version_ID=PriceList_Version_ID AND M_Product_ID=Product_ID;
-- DBMS_OUTPUT.PUT_LINE('Price=' || v_Price);
-- No Price - Check if BOM
IF (v_Price = 0) THEN
FOR bom IN CUR_BOM LOOP
v_ProductPrice := bomPriceLimit (bom.M_ProductBOM_ID, PriceList_Version_ID);
v_Price := v_Price + (bom.BOMQty * v_ProductPrice);
END LOOP;
END IF;
--
RETURN v_Price;
END bomPriceLimit;
/

View File

@ -0,0 +1,49 @@
CREATE OR REPLACE FUNCTION bomPriceList
(
Product_ID IN NUMBER,
PriceList_Version_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2002 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: BOM_PriceList.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Return List Price of Product/BOM
* Description:
* if not found: 0
************************************************************************/
AS
v_Price NUMBER;
v_ProductPrice NUMBER;
-- Get BOM Product info
CURSOR CUR_BOM IS
SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM
FROM M_Product_BOM b, M_Product p
WHERE b.M_ProductBOM_ID=p.M_Product_ID
AND b.M_Product_ID=Product_ID;
--
BEGIN
-- Try to get price from pricelist directly
SELECT COALESCE (SUM(PriceList), 0)
INTO v_Price
FROM M_ProductPrice
WHERE M_PriceList_Version_ID=PriceList_Version_ID AND M_Product_ID=Product_ID;
-- DBMS_OUTPUT.PUT_LINE('Price=' || Price);
-- No Price - Check if BOM
IF (v_Price = 0) THEN
FOR bom IN CUR_BOM LOOP
v_ProductPrice := bomPriceList (bom.M_ProductBOM_ID, PriceList_Version_ID);
v_Price := v_Price + (bom.BOMQty * v_ProductPrice);
-- DBMS_OUTPUT.PUT_LINE('Qry=' || bom.BOMQty || ' @ ' || v_ProductPrice || ', Price=' || v_Price);
END LOOP; -- BOM
END IF;
--
RETURN v_Price;
END bomPriceList;
/

View File

@ -0,0 +1,49 @@
CREATE OR REPLACE FUNCTION bomPriceStd
(
Product_ID IN NUMBER,
PriceList_Version_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2002 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: BOM_PriceStd.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Return Standard Price of Product/BOM
* Description:
* if not found: 0
************************************************************************/
AS
v_Price NUMBER;
v_ProductPrice NUMBER;
-- Get BOM Product info
CURSOR CUR_BOM IS
SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM
FROM M_Product_BOM b, M_Product p
WHERE b.M_ProductBOM_ID=p.M_Product_ID
AND b.M_Product_ID=Product_ID;
--
BEGIN
-- Try to get price from pricelist directly
SELECT COALESCE(SUM(PriceStd), 0)
INTO v_Price
FROM M_ProductPrice
WHERE M_PriceList_Version_ID=PriceList_Version_ID AND M_Product_ID=Product_ID;
-- DBMS_OUTPUT.PUT_LINE('Price=' || v_Price);
-- No Price - Check if BOM
IF (v_Price = 0) THEN
FOR bom IN CUR_BOM LOOP
v_ProductPrice := bomPriceStd (bom.M_ProductBOM_ID, PriceList_Version_ID);
v_Price := v_Price + (bom.BOMQty * v_ProductPrice);
-- DBMS_OUTPUT.PUT_LINE('Price=' || v_Price);
END LOOP; -- BOM
END IF;
--
RETURN v_Price;
END bomPriceStd;
/

View File

@ -0,0 +1,21 @@
CREATE OR REPLACE FUNCTION bomQtyAvailable
(
Product_ID IN NUMBER,
Warehouse_ID IN NUMBER,
Locator_ID IN NUMBER -- Only used, if warehouse is null
)
RETURN NUMBER
/******************************************************************************
* ** Compiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
* Open Source Software Provided "AS IS" without warranty or liability
* When you use any parts (changed or unchanged), add "Powered by Compiere" to
* your product name; See license details http://www.compiere.org/license.html
******************************************************************************
* Return quantity available for BOM
*/
AS
BEGIN
RETURN bomQtyOnHand(Product_ID, Warehouse_ID, Locator_ID)
- bomQtyReserved(Product_ID, Warehouse_ID, Locator_ID);
END bomQtyAvailable;
/

View File

@ -0,0 +1,120 @@
CREATE OR REPLACE FUNCTION bomQtyOnHand
(
Product_ID IN NUMBER,
Warehouse_ID IN NUMBER,
Locator_ID IN NUMBER -- Only used, if warehouse is null
)
RETURN NUMBER
/******************************************************************************
* ** Compiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
* Open Source Software Provided "AS IS" without warranty or liability
* When you use any parts (changed or unchanged), add "Powered by Compiere" to
* your product name; See license details http://www.compiere.org/license.html
******************************************************************************
* Return quantity on hand for BOM
*/
AS
myWarehouse_ID NUMBER;
Quantity NUMBER := 99999; -- unlimited
IsBOM CHAR(1);
IsStocked CHAR(1);
ProductType CHAR(1);
ProductQty NUMBER;
StdPrecision NUMBER;
-- Get BOM Product info
CURSOR CUR_BOM IS
SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM, p.IsStocked, p.ProductType
FROM M_Product_BOM b, M_Product p
WHERE b.M_ProductBOM_ID=p.M_Product_ID
AND b.M_Product_ID=Product_ID;
--
BEGIN
-- Check Parameters
myWarehouse_ID := Warehouse_ID;
IF (myWarehouse_ID IS NULL) THEN
IF (Locator_ID IS NULL) THEN
RETURN 0;
ELSE
SELECT SUM(M_Warehouse_ID) INTO myWarehouse_ID
FROM M_Locator
WHERE M_Locator_ID=Locator_ID;
END IF;
END IF;
IF (myWarehouse_ID IS NULL) THEN
RETURN 0;
END IF;
-- DBMS_OUTPUT.PUT_LINE('Warehouse=' || myWarehouse_ID);
-- Check, if product exists and if it is stocked
BEGIN
SELECT IsBOM, ProductType, IsStocked
INTO IsBOM, ProductType, IsStocked
FROM M_Product
WHERE M_Product_ID=Product_ID;
--
EXCEPTION -- not found
WHEN OTHERS THEN
RETURN 0;
END;
-- Unimited capacity if no item
IF (IsBOM='N' AND (ProductType<>'I' OR IsStocked='N')) THEN
RETURN Quantity;
-- Stocked item
ELSIF (IsStocked='Y') THEN
-- Get ProductQty
SELECT NVL(SUM(QtyOnHand), 0)
INTO ProductQty
FROM M_Storage s
WHERE M_Product_ID=Product_ID
AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
AND l.M_Warehouse_ID=myWarehouse_ID);
--
-- DBMS_OUTPUT.PUT_LINE('Qty=' || ProductQty);
RETURN ProductQty;
END IF;
-- Go though BOM
-- DBMS_OUTPUT.PUT_LINE('BOM');
FOR bom IN CUR_BOM LOOP
-- Stocked Items "leaf node"
IF (bom.ProductType = 'I' AND bom.IsStocked = 'Y') THEN
-- Get ProductQty
SELECT NVL(SUM(QtyOnHand), 0)
INTO ProductQty
FROM M_Storage s
WHERE M_Product_ID=bom.M_ProductBOM_ID
AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
AND l.M_Warehouse_ID=myWarehouse_ID);
-- Get Rounding Precision
SELECT NVL(MAX(u.StdPrecision), 0)
INTO StdPrecision
FROM C_UOM u, M_Product p
WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=bom.M_ProductBOM_ID;
-- How much can we make with this product
ProductQty := ROUND (ProductQty/bom.BOMQty, StdPrecision);
-- How much can we make overall
IF (ProductQty < Quantity) THEN
Quantity := ProductQty;
END IF;
-- Another BOM
ELSIF (bom.IsBOM = 'Y') THEN
ProductQty := bomQtyOnHand (bom.M_ProductBOM_ID, myWarehouse_ID, Locator_ID);
-- How much can we make overall
IF (ProductQty < Quantity) THEN
Quantity := ProductQty;
END IF;
END IF;
END LOOP; -- BOM
IF (Quantity > 0) THEN
-- Get Rounding Precision for Product
SELECT NVL(MAX(u.StdPrecision), 0)
INTO StdPrecision
FROM C_UOM u, M_Product p
WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=Product_ID;
--
RETURN ROUND (Quantity, StdPrecision);
END IF;
RETURN 0;
END bomQtyOnHand;
/

View File

@ -0,0 +1,126 @@
CREATE OR REPLACE FUNCTION bomQtyOrdered
(
p_Product_ID IN NUMBER,
p_Warehouse_ID IN NUMBER,
p_Locator_ID IN NUMBER -- Only used, if warehouse is null
)
RETURN NUMBER
/******************************************************************************
* ** Compiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
* Open Source Software Provided "AS IS" without warranty or liability
* When you use any parts (changed or unchanged), add "Powered by Compiere" to
* your product name; See license details http://www.compiere.org/license.html
******************************************************************************
* Return quantity ordered for BOM
*/
AS
v_Warehouse_ID NUMBER;
v_Quantity NUMBER := 99999; -- unlimited
v_IsBOM CHAR(1);
v_IsStocked CHAR(1);
v_ProductType CHAR(1);
v_ProductQty NUMBER;
v_StdPrecision NUMBER;
-- Get BOM Product info
CURSOR CUR_BOM IS
SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM, p.IsStocked, p.ProductType
FROM M_Product_BOM b, M_Product p
WHERE b.M_ProductBOM_ID=p.M_Product_ID
AND b.M_Product_ID=p_Product_ID;
--
BEGIN
-- Check Parameters
v_Warehouse_ID := p_Warehouse_ID;
IF (v_Warehouse_ID IS NULL) THEN
IF (p_Locator_ID IS NULL) THEN
RETURN 0;
ELSE
SELECT MAX(M_Warehouse_ID) INTO v_Warehouse_ID
FROM M_Locator
WHERE M_Locator_ID=p_Locator_ID;
END IF;
END IF;
IF (v_Warehouse_ID IS NULL) THEN
RETURN 0;
END IF;
-- DBMS_OUTPUT.PUT_LINE('Warehouse=' || v_Warehouse_ID);
-- Check, if product exists and if it is stocked
BEGIN
SELECT IsBOM, ProductType, IsStocked
INTO v_IsBOM, v_ProductType, v_IsStocked
FROM M_Product
WHERE M_Product_ID=p_Product_ID;
--
EXCEPTION -- not found
WHEN OTHERS THEN
RETURN 0;
END;
-- No reservation for non-stocked
IF (v_IsBOM='N' AND (v_ProductType<>'I' OR v_IsStocked='N')) THEN
RETURN 0;
-- Stocked item
ELSIF (v_IsStocked='Y') THEN
-- Get ProductQty
SELECT NVL(SUM(QtyOrdered), 0)
INTO v_ProductQty
FROM M_Storage s
WHERE M_Product_ID=p_Product_ID
AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
AND l.M_Warehouse_ID=v_Warehouse_ID);
--
RETURN v_ProductQty;
END IF;
-- Go though BOM
-- DBMS_OUTPUT.PUT_LINE('BOM');
FOR bom IN CUR_BOM LOOP
-- Stocked Items "leaf node"
IF (bom.ProductType = 'I' AND bom.IsStocked = 'Y') THEN
-- Get ProductQty
SELECT NVL(SUM(QtyOrdered), 0)
INTO v_ProductQty
FROM M_Storage s
WHERE M_Product_ID=bom.M_ProductBOM_ID
AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
AND l.M_Warehouse_ID=v_Warehouse_ID);
-- Get Rounding Precision
SELECT NVL(MAX(u.StdPrecision), 0)
INTO v_StdPrecision
FROM C_UOM u, M_Product p
WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=bom.M_ProductBOM_ID;
-- How much can we make with this product
v_ProductQty := ROUND (v_ProductQty/bom.BOMQty, v_StdPrecision);
-- How much can we make overall
IF (v_ProductQty < v_Quantity) THEN
v_Quantity := v_ProductQty;
END IF;
-- Another BOM
ELSIF (bom.IsBOM = 'Y') THEN
v_ProductQty := bomQtyOrdered (bom.M_ProductBOM_ID, v_Warehouse_ID, p_Locator_ID);
-- How much can we make overall
IF (v_ProductQty < v_Quantity) THEN
v_Quantity := v_ProductQty;
END IF;
END IF;
END LOOP; -- BOM
-- Unlimited (e.g. only services)
IF (v_Quantity = 99999) THEN
RETURN 0;
END IF;
IF (v_Quantity > 0) THEN
-- Get Rounding Precision for Product
SELECT NVL(MAX(u.StdPrecision), 0)
INTO v_StdPrecision
FROM C_UOM u, M_Product p
WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=p_Product_ID;
--
RETURN ROUND (v_Quantity, v_StdPrecision);
END IF;
--
RETURN 0;
END bomQtyOrdered;
/

View File

@ -0,0 +1,125 @@
CREATE OR REPLACE FUNCTION bomQtyReserved
(
p_Product_ID IN NUMBER,
p_Warehouse_ID IN NUMBER,
p_Locator_ID IN NUMBER -- Only used, if warehouse is null
)
RETURN NUMBER
/******************************************************************************
* ** Compiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
* Open Source Software Provided "AS IS" without warranty or liability
* When you use any parts (changed or unchanged), add "Powered by Compiere" to
* your product name; See license details http://www.compiere.org/license.html
******************************************************************************
* Return quantity reserved for BOM
*/
AS
v_Warehouse_ID NUMBER;
v_Quantity NUMBER := 99999; -- unlimited
v_IsBOM CHAR(1);
v_IsStocked CHAR(1);
v_ProductType CHAR(1);
v_ProductQty NUMBER;
v_StdPrecision NUMBER;
-- Get BOM Product info
CURSOR CUR_BOM IS
SELECT b.M_ProductBOM_ID, b.BOMQty, p.IsBOM, p.IsStocked, p.ProductType
FROM M_Product_BOM b, M_Product p
WHERE b.M_ProductBOM_ID=p.M_Product_ID
AND b.M_Product_ID=p_Product_ID;
--
BEGIN
-- Check Parameters
v_Warehouse_ID := p_Warehouse_ID;
IF (v_Warehouse_ID IS NULL) THEN
IF (p_Locator_ID IS NULL) THEN
RETURN 0;
ELSE
SELECT MAX(M_Warehouse_ID) INTO v_Warehouse_ID
FROM M_Locator
WHERE M_Locator_ID=p_Locator_ID;
END IF;
END IF;
IF (v_Warehouse_ID IS NULL) THEN
RETURN 0;
END IF;
-- DBMS_OUTPUT.PUT_LINE('Warehouse=' || v_Warehouse_ID);
-- Check, if product exists and if it is stocked
BEGIN
SELECT IsBOM, ProductType, IsStocked
INTO v_IsBOM, v_ProductType, v_IsStocked
FROM M_Product
WHERE M_Product_ID=p_Product_ID;
--
EXCEPTION -- not found
WHEN OTHERS THEN
RETURN 0;
END;
-- No reservation for non-stocked
IF (v_IsBOM='N' AND (v_ProductType<>'I' OR v_IsStocked='N')) THEN
RETURN 0;
-- Stocked item
ELSIF (v_IsStocked='Y') THEN
-- Get ProductQty
SELECT NVL(SUM(QtyReserved), 0)
INTO v_ProductQty
FROM M_Storage s
WHERE M_Product_ID=p_Product_ID
AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
AND l.M_Warehouse_ID=v_Warehouse_ID);
--
RETURN v_ProductQty;
END IF;
-- Go though BOM
-- DBMS_OUTPUT.PUT_LINE('BOM');
FOR bom IN CUR_BOM LOOP
-- Stocked Items "leaf node"
IF (bom.ProductType = 'I' AND bom.IsStocked = 'Y') THEN
-- Get ProductQty
SELECT NVL(SUM(QtyReserved), 0)
INTO v_ProductQty
FROM M_Storage s
WHERE M_Product_ID=bom.M_ProductBOM_ID
AND EXISTS (SELECT * FROM M_Locator l WHERE s.M_Locator_ID=l.M_Locator_ID
AND l.M_Warehouse_ID=v_Warehouse_ID);
-- Get Rounding Precision
SELECT NVL(MAX(u.StdPrecision), 0)
INTO v_StdPrecision
FROM C_UOM u, M_Product p
WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=bom.M_ProductBOM_ID;
-- How much can we make with this product
v_ProductQty := ROUND (v_ProductQty/bom.BOMQty, v_StdPrecision);
-- How much can we make overall
IF (v_ProductQty < v_Quantity) THEN
v_Quantity := v_ProductQty;
END IF;
-- Another BOM
ELSIF (bom.IsBOM = 'Y') THEN
v_ProductQty := bomQtyReserved (bom.M_ProductBOM_ID, v_Warehouse_ID, p_Locator_ID);
-- How much can we make overall
IF (v_ProductQty < v_Quantity) THEN
v_Quantity := v_ProductQty;
END IF;
END IF;
END LOOP; -- BOM
-- Unlimited (e.g. only services)
IF (v_Quantity = 99999) THEN
RETURN 0;
END IF;
IF (v_Quantity > 0) THEN
-- Get Rounding Precision for Product
SELECT NVL(MAX(u.StdPrecision), 0)
INTO v_StdPrecision
FROM C_UOM u, M_Product p
WHERE u.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=p_Product_ID;
--
RETURN ROUND (v_Quantity, v_StdPrecision);
END IF;
RETURN 0;
END bomQtyReserved;
/

View File

@ -0,0 +1,34 @@
CREATE OR REPLACE FUNCTION bpartnerRemitLocation
(
p_C_BPartner_ID C_BPartner.C_BPartner_ID%TYPE
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2002 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_BPartner_RemitLocation.SQL,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Return the first RemitTo C_Location_ID of a Business Partner
* Description:
*
************************************************************************/
AS
v_C_Location_ID NUMBER := NULL;
CURSOR CUR_BPLoc IS
SELECT IsRemitTo, C_Location_ID
FROM C_BPartner_Location
WHERE C_BPartner_ID=p_C_BPartner_ID
ORDER BY IsRemitTo DESC;
BEGIN
FOR l IN CUR_BPLoc LOOP
IF (v_C_Location_ID IS NULL) THEN
v_C_Location_ID := l.C_Location_ID;
END IF;
END LOOP;
RETURN v_C_Location_ID;
END bpartnerRemitLocation;
/

View File

@ -0,0 +1,47 @@
CREATE OR REPLACE FUNCTION currencyBase
(
p_Amount IN NUMBER,
p_CurFrom_ID IN NUMBER,
p_ConvDate IN DATE,
p_Client_ID IN NUMBER,
p_Org_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Base_Convert.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Convert Amount to Base Currency of Client
* Description:
* Get CurrencyTo from Client
* Returns NULL, if conversion not found
* Standard Rounding
* Test:
* SELECT C_Base_Convert(100,116,11,null) FROM DUAL => 64.72
************************************************************************/
AS
v_CurTo_ID NUMBER;
BEGIN
-- Get Currency
SELECT MAX(ac.C_Currency_ID)
INTO v_CurTo_ID
FROM AD_ClientInfo ci, C_AcctSchema ac
WHERE ci.C_AcctSchema1_ID=ac.C_AcctSchema_ID
AND ci.AD_Client_ID=p_Client_ID;
-- Same as Currency_Conversion - if currency/rate not found - return 0
IF (v_CurTo_ID IS NULL) THEN
RETURN NULL;
END IF;
-- Same currency
IF (p_CurFrom_ID = v_CurTo_ID) THEN
RETURN p_Amount;
END IF;
RETURN currencyConvert (p_Amount, p_CurFrom_ID, v_CurTo_ID, p_ConvDate, null, p_Client_ID, p_Org_ID);
END currencyBase;
/

View File

@ -0,0 +1,51 @@
CREATE OR REPLACE FUNCTION currencyConvert
(
p_Amount IN NUMBER,
p_CurFrom_ID IN NUMBER,
p_CurTo_ID IN NUMBER,
p_ConvDate IN DATE,
p_ConversionType_ID IN NUMBER,
p_Client_ID IN NUMBER,
p_Org_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Currency_Convert.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Convert Amount (using IDs)
* Description:
* from CurrencyFrom_ID to CurrencyTo_ID
* Returns NULL, if conversion not found
* Standard Rounding
* Test:
* SELECT C_Currency_Convert(100,116,100,null,null) FROM DUAL => 64.72
* SELECT C_Currency_Convert(100,116,100) FROM DUAL => 64.72
************************************************************************/
AS
v_Rate NUMBER;
BEGIN
-- Return Amount
IF (p_Amount = 0 OR p_CurFrom_ID = p_CurTo_ID) THEN
RETURN p_Amount;
END IF;
-- Return NULL
IF (p_Amount IS NULL OR p_CurFrom_ID IS NULL OR p_CurTo_ID IS NULL) THEN
RETURN NULL;
END IF;
-- Get Rate
v_Rate := currencyRate (p_CurFrom_ID, p_CurTo_ID, p_ConvDate, p_ConversionType_ID, p_Client_ID, p_Org_ID);
IF (v_Rate IS NULL) THEN
RETURN NULL;
END IF;
-- Standard Precision
RETURN currencyRound(p_Amount * v_Rate, p_CurTo_ID, null);
END currencyConvert;
/

View File

@ -0,0 +1,171 @@
CREATE OR REPLACE FUNCTION currencyRate
(
p_CurFrom_ID IN NUMBER,
p_CurTo_ID IN NUMBER,
p_ConvDate IN DATE,
p_ConversionType_ID IN NUMBER,
p_Client_ID IN NUMBER,
p_Org_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Currency_Rate.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Return Conversion Rate
* Description:
* from CurrencyFrom_ID to CurrencyTo_ID
* Returns NULL, if rate not found
* Test
* SELECT C_Currency_Rate(116, 100, null, null) FROM DUAL; => .647169
* SELECT C_Currency_Rate(116, 100) FROM DUAL; => .647169
************************************************************************/
AS
-- Currency From variables
cf_IsEuro CHAR(1);
cf_IsEMUMember CHAR(1);
cf_EMUEntryDate DATE;
cf_EMURate NUMBER;
-- Currency To variables
ct_IsEuro CHAR(1);
ct_IsEMUMember CHAR(1);
ct_EMUEntryDate DATE;
ct_EMURate NUMBER;
-- Triangle
v_CurrencyFrom NUMBER;
v_CurrencyTo NUMBER;
v_CurrencyEuro NUMBER;
--
v_ConvDate DATE := SysDate;
v_ConversionType_ID NUMBER := 0;
v_Rate NUMBER;
BEGIN
-- No Conversion
IF (p_CurFrom_ID = p_CurTo_ID) THEN
RETURN 1;
END IF;
-- Default Date Parameter
IF (p_ConvDate IS NOT NULL) THEN
v_ConvDate := p_ConvDate; -- SysDate
END IF;
-- Default Conversion Type
IF (p_ConversionType_ID IS NULL OR p_ConversionType_ID = 0) THEN
BEGIN
SELECT C_ConversionType_ID
INTO v_ConversionType_ID
FROM C_ConversionType
WHERE IsDefault='Y'
AND AD_Client_ID IN (0,p_Client_ID)
AND ROWNUM=1
ORDER BY AD_Client_ID DESC;
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Conversion Type Not Found');
END;
ELSE
v_ConversionType_ID := p_ConversionType_ID;
END IF;
-- Get Currency Info
SELECT MAX(IsEuro), MAX(IsEMUMember), MAX(EMUEntryDate), MAX(EMURate)
INTO cf_IsEuro, cf_IsEMUMember, cf_EMUEntryDate, cf_EMURate
FROM C_Currency
WHERE C_Currency_ID = p_CurFrom_ID;
-- Not Found
IF (cf_IsEuro IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('From Currency Not Found');
RETURN NULL;
END IF;
SELECT MAX(IsEuro), MAX(IsEMUMember), MAX(EMUEntryDate), MAX(EMURate)
INTO ct_IsEuro, ct_IsEMUMember, ct_EMUEntryDate, ct_EMURate
FROM C_Currency
WHERE C_Currency_ID = p_CurTo_ID;
-- Not Found
IF (ct_IsEuro IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('To Currency Not Found');
RETURN NULL;
END IF;
-- Fixed - From Euro to EMU
IF (cf_IsEuro = 'Y' AND ct_IsEMUMember ='Y' AND v_ConvDate >= ct_EMUEntryDate) THEN
RETURN ct_EMURate;
END IF;
-- Fixed - From EMU to Euro
IF (ct_IsEuro = 'Y' AND cf_IsEMUMember ='Y' AND v_ConvDate >= cf_EMUEntryDate) THEN
RETURN 1 / cf_EMURate;
END IF;
-- Fixed - From EMU to EMU
IF (cf_IsEMUMember = 'Y' AND cf_IsEMUMember ='Y'
AND v_ConvDate >= cf_EMUEntryDate AND v_ConvDate >= ct_EMUEntryDate) THEN
RETURN ct_EMURate / cf_EMURate;
END IF;
-- Flexible Rates
v_CurrencyFrom := p_CurFrom_ID;
v_CurrencyTo := p_CurTo_ID;
-- if EMU Member involved, replace From/To Currency
IF ((cf_isEMUMember = 'Y' AND v_ConvDate >= cf_EMUEntryDate)
OR (ct_isEMUMember = 'Y' AND v_ConvDate >= ct_EMUEntryDate)) THEN
SELECT MAX(C_Currency_ID)
INTO v_CurrencyEuro
FROM C_Currency
WHERE IsEuro = 'Y';
-- Conversion Rate not Found
IF (v_CurrencyEuro IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('Euro Not Found');
RETURN NULL;
END IF;
IF (cf_isEMUMember = 'Y' AND v_ConvDate >= cf_EMUEntryDate) THEN
v_CurrencyFrom := v_CurrencyEuro;
ELSE
v_CurrencyTo := v_CurrencyEuro;
END IF;
END IF;
-- Get Rate
DECLARE
CURSOR CUR_Rate IS
SELECT MultiplyRate
FROM C_Conversion_Rate
WHERE C_Currency_ID=v_CurrencyFrom AND C_Currency_ID_To=v_CurrencyTo
AND C_ConversionType_ID=v_ConversionType_ID
AND v_ConvDate BETWEEN ValidFrom AND ValidTo
AND AD_Client_ID IN (0,p_Client_ID) AND AD_Org_ID IN (0,p_Org_ID)
ORDER BY AD_Client_ID DESC, AD_Org_ID DESC, ValidFrom DESC;
BEGIN
FOR c IN CUR_Rate LOOP
v_Rate := c.MultiplyRate;
EXIT; -- only first
END LOOP;
END;
-- Not found
IF (v_Rate IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('Conversion Rate Not Found');
RETURN NULL;
END IF;
-- Currency From was EMU
IF (cf_isEMUMember = 'Y' AND v_ConvDate >= cf_EMUEntryDate) THEN
RETURN v_Rate / cf_EMURate;
END IF;
-- Currency To was EMU
IF (ct_isEMUMember = 'Y' AND v_ConvDate >= ct_EMUEntryDate) THEN
RETURN v_Rate * ct_EMURate;
END IF;
RETURN v_Rate;
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
RETURN NULL;
END currencyRate;
/

View File

@ -0,0 +1,49 @@
CREATE OR REPLACE FUNCTION currencyRound
(
p_Amount IN NUMBER,
p_CurTo_ID IN NUMBER,
p_Costing IN VARCHAR2 -- Default 'N'
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Currency_Round.SQL,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Round amount for Traget Currency
* Description:
* Round Amount using Costing or Standard Precision
* Returns unmodified amount if currency not found
* Test:
* SELECT C_Currency_Round(C_Currency_Convert(100,116,100,null,null),100,null) FROM DUAL => 64.72
************************************************************************/
AS
v_StdPrecision NUMBER;
v_CostPrecision NUMBER;
BEGIN
-- Nothing to convert
IF (p_Amount IS NULL OR p_CurTo_ID IS NULL) THEN
RETURN p_Amount;
END IF;
-- Ger Precision
SELECT MAX(StdPrecision), MAX(CostingPrecision)
INTO v_StdPrecision, v_CostPrecision
FROM C_Currency
WHERE C_Currency_ID = p_CurTo_ID;
-- Currency Not Found
IF (v_StdPrecision IS NULL) THEN
RETURN p_Amount;
END IF;
IF (p_Costing = 'Y') THEN
RETURN ROUND (p_Amount, v_CostPrecision);
END IF;
RETURN ROUND (p_Amount, v_StdPrecision);
END currencyRound;
/

View File

@ -0,0 +1,74 @@
CREATE OR REPLACE FUNCTION invoiceDiscount
(
p_C_Invoice_ID IN NUMBER,
p_PayDate IN DATE,
p_C_InvoicePaySchedule_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Invoice_Discount.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Calculate Payment Discount Amount
* Description:
* - Calculate discountable amount (i.e. with or without tax)
* - Calculate and return payment discount
************************************************************************/
AS
v_Amount NUMBER;
v_IsDiscountLineAmt CHAR(1);
v_GrandTotal NUMBER;
v_TotalLines NUMBER;
v_C_PaymentTerm_ID NUMBER(10);
v_DocDate DATE;
v_PayDate DATE := SysDate;
v_IsPayScheduleValid CHAR(1);
BEGIN
SELECT ci.IsDiscountLineAmt, i.GrandTotal, i.TotalLines,
i.C_PaymentTerm_ID, i.DateInvoiced, i.IsPayScheduleValid
INTO v_IsDiscountLineAmt, v_GrandTotal, v_TotalLines,
v_C_PaymentTerm_ID, v_DocDate, v_IsPayScheduleValid
FROM AD_ClientInfo ci, C_Invoice i
WHERE ci.AD_Client_ID=i.AD_Client_ID
AND i.C_Invoice_ID=p_C_Invoice_ID;
-- What Amount is the Discount Base?
IF (v_IsDiscountLineAmt = 'Y') THEN
v_Amount := v_TotalLines;
ELSE
v_Amount := v_GrandTotal;
END IF;
-- Anything to discount?
IF (v_Amount = 0) THEN
RETURN 0;
END IF;
IF (p_PayDate IS NOT NULL) THEN
v_PayDate := p_PayDate;
END IF;
-- Valid Payment Schedule
IF (v_IsPayScheduleValid='Y' AND p_C_InvoicePaySchedule_ID > 0) THEN
SELECT COALESCE(MAX(DiscountAmt),0)
INTO v_Amount
FROM C_InvoicePaySchedule
WHERE C_InvoicePaySchedule_ID=p_C_InvoicePaySchedule_ID
AND DiscountDate <= v_PayDate;
--
RETURN v_Amount;
END IF;
-- return discount amount
RETURN paymentTermDiscount (v_Amount, 0, v_C_PaymentTerm_ID, v_DocDate, p_PayDate);
-- Most likely if invoice not found
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END invoiceDiscount;
/

View File

@ -0,0 +1,115 @@
CREATE OR REPLACE FUNCTION invoiceOpen
(
p_C_Invoice_ID IN NUMBER,
p_C_InvoicePaySchedule_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Invoice_Open.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Calculate Open Item Amount in Invoice Currency
* Description:
* Add up total amount open for C_Invoice_ID if no split payment.
* Grand Total minus Sum of Allocations in Invoice Currency
*
* For Split Payments:
* Allocate Payments starting from first schedule.
SELECT C_Invoice_Open (109) FROM DUAL;
SELECT C_Invoice_Open (109, null) FROM DUAL;
SELECT C_Invoice_Open (109, 11) FROM DUAL;
SELECT C_Invoice_Open (109, 102) FROM DUAL;
SELECT C_Invoice_Open (109, 103) FROM DUAL;
SELECT * FROM RV_OpenItem WHERE C_Invoice_ID=109;
SELECT C_InvoicePaySchedule_ID, DueAmt FROM C_InvoicePaySchedule WHERE C_Invoice_ID=109 ORDER BY DueDate;
* Cannot be used for IsPaid as mutating
************************************************************************/
AS
v_Currency_ID NUMBER(10);
v_TotalOpenAmt NUMBER := 0;
v_PaidAmt NUMBER := 0;
v_Remaining NUMBER := 0;
v_MultiplierAP NUMBER := 0;
v_MultiplierCM NUMBER := 0;
v_Temp NUMBER := 0;
--
CURSOR Cur_Alloc IS
SELECT a.AD_Client_ID, a.AD_Org_ID,
al.Amount, al.DiscountAmt, al.WriteOffAmt,
a.C_Currency_ID, a.DateTrx
FROM C_AllocationLine al
INNER JOIN C_AllocationHdr a ON (al.C_AllocationHdr_ID=a.C_AllocationHdr_ID)
WHERE al.C_Invoice_ID = p_C_Invoice_ID
AND a.IsActive='Y';
--
CURSOR Cur_PaySchedule IS
SELECT C_InvoicePaySchedule_ID, DueAmt
FROM C_InvoicePaySchedule
WHERE C_Invoice_ID = p_C_Invoice_ID
AND IsValid='Y'
ORDER BY DueDate;
BEGIN
-- Get Currency
BEGIN
SELECT MAX(C_Currency_ID), SUM(GrandTotal), MAX(MultiplierAP), MAX(Multiplier)
INTO v_Currency_ID, v_TotalOpenAmt, v_MultiplierAP, v_MultiplierCM
FROM C_Invoice_v -- corrected for CM / Split Payment
WHERE C_Invoice_ID = p_C_Invoice_ID;
EXCEPTION -- Invoice in draft form
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('InvoiceOpen - ' || SQLERRM);
RETURN NULL;
END;
-- DBMS_OUTPUT.PUT_LINE('== C_Invoice_ID=' || p_C_Invoice_ID || ', Total=' || v_TotalOpenAmt || ', AP=' || v_MultiplierAP || ', CM=' || v_MultiplierCM);
-- Calculate Allocated Amount
FOR a IN Cur_Alloc LOOP
v_Temp := a.Amount + a.DisCountAmt + a.WriteOffAmt;
v_PaidAmt := v_PaidAmt
-- Allocation
+ currencyConvert(v_Temp * v_MultiplierAP,
a.C_Currency_ID, v_Currency_ID, a.DateTrx, null, a.AD_Client_ID, a.AD_Org_ID);
DBMS_OUTPUT.PUT_LINE(' PaidAmt=' || v_PaidAmt || ', Allocation=' || v_Temp || ' * ' || v_MultiplierAP);
END LOOP;
-- Do we have a Payment Schedule ?
IF (p_C_InvoicePaySchedule_ID > 0) THEN -- if not valid = lists invoice amount
v_Remaining := v_PaidAmt;
FOR s IN Cur_PaySchedule LOOP
IF (s.C_InvoicePaySchedule_ID = p_C_InvoicePaySchedule_ID) THEN
v_TotalOpenAmt := (s.DueAmt*v_MultiplierCM) + v_Remaining;
IF (s.DueAmt - v_Remaining < 0) THEN
v_TotalOpenAmt := 0;
END IF;
-- DBMS_OUTPUT.PUT_LINE('Sched Total=' || v_TotalOpenAmt || ', Due=' || s.DueAmt || ',Remaining=' || v_Remaining || ',CM=' || v_MultiplierCM);
ELSE -- calculate amount, which can be allocated to next schedule
v_Remaining := v_Remaining - s.DueAmt;
IF (v_Remaining < 0) THEN
v_Remaining := 0;
END IF;
-- DBMS_OUTPUT.PUT_LINE('Remaining=' || v_Remaining);
END IF;
END LOOP;
ELSE
v_TotalOpenAmt := v_TotalOpenAmt - v_PaidAmt;
END IF;
-- DBMS_OUTPUT.PUT_LINE('== Total=' || v_TotalOpenAmt);
-- Ignore Rounding
IF (v_TotalOpenAmt BETWEEN -0.00999 AND 0.00999) THEN
v_TotalOpenAmt := 0;
END IF;
-- Round to penny
v_TotalOpenAmt := ROUND(COALESCE(v_TotalOpenAmt,0), 2);
RETURN v_TotalOpenAmt;
END invoiceOpen;
/

View File

@ -0,0 +1,60 @@
CREATE OR REPLACE FUNCTION invoicePaid
(
p_C_Invoice_ID IN NUMBER,
p_C_Currency_ID IN NUMBER,
p_MultiplierAP IN NUMBER -- DEFAULT 1
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Invoice_Paid.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Calculate Paid/Allocated amount in Currency
* Description:
* Add up total amount paid for for C_Invoice_ID.
* Split Payments are ignored.
* all allocation amounts converted to invoice C_Currency_ID
* round it to the nearest cent
* and adjust for CreditMemos by using C_Invoice_v
* and for Payments with the multiplierAP (-1, 1)
*
SELECT C_Invoice_ID, IsPaid, IsSOTrx, GrandTotal,
C_Invoice_Paid (C_Invoice_ID, C_Currency_ID, MultiplierAP)
FROM C_Invoice_v;
--
UPDATE C_Invoice_v1
SET IsPaid = CASE WHEN C_Invoice_Paid(C_Invoice_ID,C_Currency_ID,MultiplierAP)=GrandTotal THEN 'Y' ELSE 'N' END
WHERE C_Invoice_ID>1000000
*
************************************************************************/
AS
v_MultiplierAP NUMBER := 1;
v_PaymentAmt NUMBER := 0;
CURSOR Cur_Alloc IS
SELECT a.AD_Client_ID, a.AD_Org_ID,
al.Amount, al.DiscountAmt, al.WriteOffAmt,
a.C_Currency_ID, a.DateTrx
FROM C_AllocationLine al
INNER JOIN C_AllocationHdr a ON (al.C_AllocationHdr_ID=a.C_AllocationHdr_ID)
WHERE al.C_Invoice_ID = p_C_Invoice_ID
AND a.IsActive='Y';
BEGIN
-- Default
IF (p_MultiplierAP IS NOT NULL) THEN
v_MultiplierAP := p_MultiplierAP;
END IF;
-- Calculate Allocated Amount
FOR a IN Cur_Alloc LOOP
v_PaymentAmt := v_PaymentAmt
+ currencyConvert(a.Amount + a.DisCountAmt + a.WriteOffAmt,
a.C_Currency_ID, p_C_Currency_ID, a.DateTrx, null, a.AD_Client_ID, a.AD_Org_ID);
END LOOP;
--
RETURN ROUND(NVL(v_PaymentAmt,0), 2) * v_MultiplierAP;
END invoicePaid;
/

View File

@ -0,0 +1,71 @@
CREATE OR REPLACE FUNCTION paymentTermDiscount
(
Amount IN NUMBER,
Currency_ID IN NUMBER,
PaymentTerm_ID IN NUMBER,
DocDate IN DATE,
PayDate IN DATE
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_PaymentTerm_Discount.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Calculate Discount
* Description:
* Calculate the allowable Discount Amount of the Payment Term
*
* Test: SELECT C_PaymentTerm_Discount(17777, 103, '10-DEC-1999') FROM DUAL
************************************************************************/
AS
Discount NUMBER := 0;
CURSOR Cur_PT IS
SELECT *
FROM C_PaymentTerm
WHERE C_PaymentTerm_ID = PaymentTerm_ID;
Discount1Date DATE;
Discount2Date DATE;
Add1Date NUMBER := 0;
Add2Date NUMBER := 0;
BEGIN
-- No Data - No Discount
IF (Amount IS NULL OR PaymentTerm_ID IS NULL OR DocDate IS NULL) THEN
RETURN 0;
END IF;
FOR p IN Cur_PT LOOP -- for convineance only
-- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Doc = ' || TO_CHAR(DocDate));
Discount1Date := TRUNC(DocDate + p.DiscountDays + p.GraceDays);
Discount2Date := TRUNC(DocDate + p.DiscountDays2 + p.GraceDays);
-- Next Business Day
IF (p.IsNextBusinessDay='Y') THEN
-- Not fully correct - only does weekends (7=Saturday, 1=Sunday)
SELECT DECODE(TO_CHAR(Discount1Date,'D'), '7',2, '1',1, 0),
DECODE(TO_CHAR(Discount2Date,'D'), '7',2, '1',1, 0)
INTO Add1Date, Add2Date
FROM DUAL;
Discount1Date := Discount1Date+Add1Date;
Discount2Date := Discount2Date+Add2Date;
END IF;
-- Discount 1
IF (Discount1Date >= TRUNC(PayDate)) THEN
-- DBMS_OUTPUT.PUT_LINE('Discount 1 ' || TO_CHAR(Discount1Date) || ' ' || p.Discount);
Discount := Amount * p.Discount / 100;
-- Discount 2
ELSIF (Discount2Date >= TRUNC(PayDate)) THEN
-- DBMS_OUTPUT.PUT_LINE('Discount 2 ' || TO_CHAR(Discount2Date) || ' ' || p.Discount2);
Discount := Amount * p.Discount2 / 100;
END IF;
END LOOP;
--
RETURN ROUND(NVL(Discount,0), 2); -- fixed rounding
END paymentTermDiscount;
/

View File

@ -0,0 +1,52 @@
CREATE OR REPLACE FUNCTION paymentTermDueDate
(
PaymentTerm_ID IN NUMBER,
DocDate IN DATE
)
RETURN DATE
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_PaymentTerm_DueDate.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Get Due Date
* Description:
* Returns the due date
************************************************************************/
AS
Days NUMBER := 0;
DueDate DATE := TRUNC(DocDate);
--
CURSOR Cur_PT IS
SELECT *
FROM C_PaymentTerm
WHERE C_PaymentTerm_ID = PaymentTerm_ID;
FirstDay DATE;
NoDays NUMBER;
BEGIN
FOR p IN Cur_PT LOOP -- for convineance only
-- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Doc = ' || TO_CHAR(DocDate));
-- Due 15th of following month
IF (p.IsDueFixed = 'Y') THEN
-- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Day = ' || p.FixMonthDay);
FirstDay := TRUNC(DocDate, 'MM');
NoDays := TRUNC(DocDate) - FirstDay;
DueDate := FirstDay + (p.FixMonthDay-1); -- starting on 1st
DueDate := ADD_MONTHS(DueDate, p.FixMonthOffset);
IF (NoDays > p.FixMonthCutoff) THEN
DueDate := ADD_MONTHS(DueDate, 1);
END IF;
ELSE
-- DBMS_OUTPUT.PUT_LINE('Net = ' || p.NetDays);
DueDate := TRUNC(DocDate) + p.NetDays;
END IF;
END LOOP;
-- DBMS_OUTPUT.PUT_LINE('Due = ' || TO_CHAR(DueDate) || ', Pay = ' || TO_CHAR(PayDate));
RETURN DueDate;
END paymentTermDueDate;
/

View File

@ -0,0 +1,58 @@
CREATE OR REPLACE FUNCTION paymentTermDueDays
(
PaymentTerm_ID IN NUMBER,
DocDate IN DATE,
PayDate IN DATE
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_PaymentTerm_DueDays.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Get Due Days
* Description:
* Returns the days due (positive) or the days till due (negative)
* Grace days are not considered!
* If record is not found it assumes due immediately
*
* Test: SELECT C_PaymentTerm_DueDays(103, '01-DEC-2000', '15-DEC-2000') FROM DUAL
************************************************************************/
AS
Days NUMBER := 0;
DueDate DATE := TRUNC(DocDate);
--
CURSOR Cur_PT IS
SELECT *
FROM C_PaymentTerm
WHERE C_PaymentTerm_ID = PaymentTerm_ID;
FirstDay DATE;
NoDays NUMBER;
BEGIN
FOR p IN Cur_PT LOOP -- for convineance only
-- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Doc = ' || TO_CHAR(DocDate));
-- Due 15th of following month
IF (p.IsDueFixed = 'Y') THEN
-- DBMS_OUTPUT.PUT_LINE(p.Name || ' - Day = ' || p.FixMonthDay);
FirstDay := TRUNC(DocDate, 'MM');
NoDays := TRUNC(DocDate) - FirstDay;
DueDate := FirstDay + (p.FixMonthDay-1); -- starting on 1st
DueDate := ADD_MONTHS(DueDate, p.FixMonthOffset);
IF (NoDays > p.FixMonthCutoff) THEN
DueDate := ADD_MONTHS(DueDate, 1);
END IF;
ELSE
-- DBMS_OUTPUT.PUT_LINE('Net = ' || p.NetDays);
DueDate := TRUNC(DocDate) + p.NetDays;
END IF;
END LOOP;
-- DBMS_OUTPUT.PUT_LINE('Due = ' || TO_CHAR(DueDate) || ', Pay = ' || TO_CHAR(PayDate));
Days := TRUNC(PayDate) - DueDate;
RETURN Days;
END paymentTermDueDays;
/

View File

@ -0,0 +1,57 @@
CREATE OR REPLACE FUNCTION paymentAllocated
(
p_C_Payment_ID IN NUMBER,
p_C_Currency_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Payment_Allocated.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Calculate Allocated Payment Amount in Payment Currency
* Description:
--
SELECT C_Payment_Allocated(C_Payment_ID,C_Currency_ID), PayAmt, IsAllocated
FROM C_Payment_v
WHERE C_Payment_ID>=1000000;
--
UPDATE C_Payment_v
SET IsAllocated=CASE WHEN C_Payment_Allocated(C_Payment_ID, C_Currency_ID)=PayAmt THEN 'Y' ELSE 'N' END
WHERE C_Payment_ID>=1000000;
************************************************************************/
AS
v_AllocatedAmt NUMBER := 0;
v_PayAmt NUMBER;
CURSOR Cur_Alloc IS
SELECT a.AD_Client_ID, a.AD_Org_ID, al.Amount, a.C_Currency_ID, a.DateTrx
FROM C_AllocationLine al
INNER JOIN C_AllocationHdr a ON (al.C_AllocationHdr_ID=a.C_AllocationHdr_ID)
WHERE al.C_Payment_ID = p_C_Payment_ID
AND a.IsActive='Y';
-- AND al.C_Invoice_ID IS NOT NULL;
BEGIN
-- Charge - nothing available
SELECT MAX(PayAmt)
INTO v_PayAmt
FROM C_Payment
WHERE C_Payment_ID=p_C_Payment_ID AND C_Charge_ID > 0;
IF (v_PayAmt IS NOT NULL) THEN
RETURN 0;
END IF;
-- Calculate Allocated Amount
FOR a IN Cur_Alloc LOOP
v_AllocatedAmt := v_AllocatedAmt
+ currencyConvert(a.Amount, a.C_Currency_ID, p_C_Currency_ID, a.DateTrx, null, a.AD_Client_ID, a.AD_Org_ID);
END LOOP;
-- Round to penny
v_AllocatedAmt := ROUND(NVL(v_AllocatedAmt,0), 2);
RETURN v_AllocatedAmt;
END paymentAllocated;
/

View File

@ -0,0 +1,62 @@
CREATE OR REPLACE FUNCTION paymentAvailable
(
p_C_Payment_ID IN NUMBER
)
RETURN NUMBER
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: C_Payment_Available.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Calculate Available Payment Amount in Payment Currency
* Description:
* similar to C_Invoice_Open
************************************************************************/
AS
v_Currency_ID NUMBER(10);
v_AvailableAmt NUMBER := 0;
v_IsReceipt C_Payment.IsReceipt%TYPE;
v_Amt NUMBER := 0;
CURSOR Cur_Alloc IS
SELECT a.AD_Client_ID, a.AD_Org_ID, al.Amount, a.C_Currency_ID, a.DateTrx
FROM C_AllocationLine al
INNER JOIN C_AllocationHdr a ON (al.C_AllocationHdr_ID=a.C_AllocationHdr_ID)
WHERE al.C_Payment_ID = p_C_Payment_ID
AND a.IsActive='Y';
-- AND al.C_Invoice_ID IS NOT NULL;
BEGIN
-- Charge - fully allocated
SELECT MAX(PayAmt)
INTO v_Amt
FROM C_Payment
WHERE C_Payment_ID=p_C_Payment_ID AND C_Charge_ID > 0;
IF (v_Amt IS NOT NULL) THEN
RETURN v_Amt;
END IF;
-- Get Currency
SELECT C_Currency_ID, PayAmt, IsReceipt
INTO v_Currency_ID, v_AvailableAmt, v_IsReceipt
FROM C_Payment_v -- corrected for AP/AR
WHERE C_Payment_ID = p_C_Payment_ID;
-- DBMS_OUTPUT.PUT_LINE('== C_Payment_ID=' || p_C_Payment_ID || ', PayAmt=' || v_AvailableAmt || ', Receipt=' || v_IsReceipt);
-- Calculate Allocated Amount
FOR a IN Cur_Alloc LOOP
v_Amt := currencyConvert(a.Amount, a.C_Currency_ID, v_Currency_ID, a.DateTrx, null, a.AD_Client_ID, a.AD_Org_ID);
v_AvailableAmt := v_AvailableAmt - v_Amt;
-- DBMS_OUTPUT.PUT_LINE(' Allocation=' || a.Amount || ' - Available=' || v_AvailableAmt);
END LOOP;
-- Ignore Rounding
IF (v_AvailableAmt BETWEEN -0.00999 AND 0.00999) THEN
v_AvailableAmt := 0;
END IF;
-- Round to penny
v_AvailableAmt := ROUND(NVL(v_AvailableAmt,0), 2);
RETURN v_AvailableAmt;
END paymentAvailable;
/

View File

@ -0,0 +1,59 @@
CREATE OR REPLACE FUNCTION DBA_ConstraintCmd
(
p_ConstraintName IN VARCHAR2
)
RETURN VARCHAR2
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: DBA_ConstraintCmd.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
* $Source: /cvs/adempiere/db/database/Functions/DBA_ConstraintCmd.sql,v $
***
* Title: Create DML command for given constraint
* Description:
* SELECT DBA_ConstraintCmd(Constraint_Name) FROM User_Constraints WHERE CONSTRAINT_TYPE='R'
************************************************************************/
AS
v_Result VARCHAR2(2000);
v_TableName VARCHAR2(256);
v_ColumnName VARCHAR2(256);
v_ConstraintName VARCHAR2(256);
v_DeleteRule VARCHAR2(256);
BEGIN
-- Get First Part
SELECT c.Table_Name, cc.Column_name, c.R_Constraint_Name, c.Delete_Rule
INTO v_TableName, v_ColumnName, v_ConstraintName, v_DeleteRule
FROM USER_Constraints c, USER_Cons_Columns cc
WHERE c.Constraint_Name=cc.Constraint_Name
AND cc.Constraint_Name=p_ConstraintName;
-- Create First Part
v_Result := 'ALTER TABLE ' || v_TableName || ' ADD CONSTRAINT ' || p_ConstraintName
|| ' FOREIGN KEY (' || v_ColumnName || ') ';
-- Not a valid FK Reference
IF (v_ConstraintName IS NULL) THEN
RETURN NULL;
END IF;
-- Get Second Part
SELECT c.Table_Name, cc.Column_name
INTO v_TableName, v_ColumnName
FROM USER_Constraints c, USER_Cons_Columns cc
WHERE c.Constraint_Name=cc.Constraint_Name
AND cc.Constraint_Name=v_ConstraintName;
-- Create Second Part
v_Result := v_Result || 'REFERENCES ' || v_TableName || '(' || v_ColumnName || ')';
IF (v_DeleteRule = 'CASCADE') THEN
v_Result := v_Result || ' ON DELETE CASCADE';
END IF;
-- DBMS_OUTPUT.PUT_LINE(v_Result);
RETURN v_Result;
END DBA_ConstraintCmd;
/

View File

@ -0,0 +1,46 @@
CREATE OR REPLACE FUNCTION DBA_DisplayType
(
AD_Reference_ID IN NUMBER
)
RETURN VARCHAR2
AS
BEGIN
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: DBA_DisplayType.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Show clear text od DisplayType
* Description:
************************************************************************/
IF (AD_Reference_ID = 10) THEN RETURN 'String = 10';
ELSIF (AD_Reference_ID = 11) THEN RETURN 'Integer = 11';
ELSIF (AD_Reference_ID = 12) THEN RETURN 'Amount = 12';
ELSIF (AD_Reference_ID = 13) THEN RETURN 'ID = 13';
ELSIF (AD_Reference_ID = 14) THEN RETURN 'Text = 14';
ELSIF (AD_Reference_ID = 15) THEN RETURN 'Date = 15';
ELSIF (AD_Reference_ID = 16) THEN RETURN 'DateTime = 16';
ELSIF (AD_Reference_ID = 17) THEN RETURN 'List = 17';
ELSIF (AD_Reference_ID = 18) THEN RETURN 'Table = 18';
ELSIF (AD_Reference_ID = 19) THEN RETURN 'TableDir = 19';
ELSIF (AD_Reference_ID = 20) THEN RETURN 'YesNo = 20';
ELSIF (AD_Reference_ID = 21) THEN RETURN 'Location = 21';
ELSIF (AD_Reference_ID = 22) THEN RETURN 'Number = 22';
ELSIF (AD_Reference_ID = 23) THEN RETURN 'Binary = 23';
ELSIF (AD_Reference_ID = 24) THEN RETURN 'Time = 24';
ELSIF (AD_Reference_ID = 25) THEN RETURN 'Account = 25';
ELSIF (AD_Reference_ID = 26) THEN RETURN 'RowID = 26';
ELSIF (AD_Reference_ID = 27) THEN RETURN 'Color = 27';
ELSIF (AD_Reference_ID = 28) THEN RETURN 'Button = 28';
ELSIF (AD_Reference_ID = 29) THEN RETURN 'Quantity = 29';
ELSIF (AD_Reference_ID = 30) THEN RETURN 'Search = 30';
ELSIF (AD_Reference_ID = 31) THEN RETURN 'Locator = 31';
ELSIF (AD_Reference_ID = 32) THEN RETURN 'Image = 32';
ELSIF (AD_Reference_ID = 33) THEN RETURN 'Assignment= 33';
ELSE RETURN 'Unknown ('||AD_Reference_ID||')'; END IF;
END DBA_DisplayType;
/

View File

@ -0,0 +1,84 @@
CREATE OR REPLACE FUNCTION productAttribute
(
p_M_AttributeSetInstance_ID IN NUMBER
)
RETURN VARCHAR2
/*************************************************************************
* The contents of this file are subject to the Compiere License. You may
* obtain a copy of the License at http://www.compiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Compiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: M_Attribute_Name.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Return Instance Attribute Info
* Description:
*
* Test:
SELECT M_Attribute_Name (M_AttributeSetInstance_ID)
FROM M_InOutLine WHERE M_AttributeSetInstance_ID > 0
--
SELECT p.Name
FROM C_InvoiceLine il LEFT OUTER JOIN M_Product p ON (il.M_Product_ID=p.M_Product_ID);
SELECT p.Name || M_Attribute_Name (il.M_AttributeSetInstance_ID)
FROM C_InvoiceLine il LEFT OUTER JOIN M_Product p ON (il.M_Product_ID=p.M_Product_ID);
************************************************************************/
AS
v_Name VARCHAR2(2000) := NULL;
v_NameAdd VARCHAR2(2000) := '';
--
v_Lot M_AttributeSetInstance.Lot%TYPE;
v_LotStart M_AttributeSet.LotCharSOverwrite%TYPE;
v_LotEnd M_AttributeSet.LotCharEOverwrite%TYPE;
v_SerNo M_AttributeSetInstance.SerNo%TYPE;
v_SerNoStart M_AttributeSet.SerNoCharSOverwrite%TYPE;
v_SerNoEnd M_AttributeSet.SerNoCharEOverwrite%TYPE;
v_GuaranteeDate M_AttributeSetInstance.GuaranteeDate%TYPE;
--
CURSOR CUR_Attributes IS
SELECT ai.Value, a.Name
FROM M_AttributeInstance ai
INNER JOIN M_Attribute a ON (ai.M_Attribute_ID=a.M_Attribute_ID AND a.IsInstanceAttribute='Y')
WHERE ai.M_AttributeSetInstance_ID=p_M_AttributeSetInstance_ID;
BEGIN
/* -- Get Product Name
SELECT Name
INTO v_Name
FROM M_Product WHERE M_Product_ID=p_M_Product_ID;
*/
-- Get Product Attribute Set Instance
IF (p_M_AttributeSetInstance_ID > 0) THEN
SELECT asi.Lot, asi.SerNo, asi.GuaranteeDate,
COALESCE(a.SerNoCharSOverwrite, '#'), COALESCE(a.SerNoCharEOverwrite, ''),
COALESCE(a.LotCharSOverwrite, '«'), COALESCE(a.LotCharEOverwrite, '»')
INTO v_Lot, v_SerNo, v_GuaranteeDate,
v_SerNoStart, v_SerNoEnd, v_LotStart, v_LotEnd
FROM M_AttributeSetInstance asi
INNER JOIN M_AttributeSet a ON (asi.M_AttributeSet_ID=a.M_AttributeSet_ID)
WHERE asi.M_AttributeSetInstance_ID=p_M_AttributeSetInstance_ID;
--
IF (v_SerNo IS NOT NULL) THEN
v_NameAdd := v_NameAdd || v_SerNoStart || v_SerNo || v_SerNoEnd || ' ';
END IF;
IF (v_Lot IS NOT NULL) THEN
v_NameAdd := v_NameAdd || v_LotStart || v_Lot || v_LotEnd || ' ';
END IF;
IF (v_GuaranteeDate IS NOT NULL) THEN
v_NameAdd := v_NameAdd || v_GuaranteeDate || ' ';
END IF;
--
FOR a IN CUR_Attributes LOOP
v_NameAdd := v_NameAdd || a.Name || ':' || a.Value || ' ';
END LOOP;
--
IF (LENGTH(v_NameAdd) > 0) THEN
v_Name := v_Name || ' (' || TRIM(v_NameAdd) || ')';
END IF;
END IF;
RETURN v_Name;
END productAttribute;
/

View File

@ -0,0 +1,55 @@
/** Get Character at Position */
CREATE OR REPLACE FUNCTION charAt
(
p_string VARCHAR2,
p_pos NUMBER
)
RETURN VARCHAR2
AS
BEGIN
RETURN SUBSTR(p_string, p_pos, 1);
END;
/
/** GetDate */
CREATE OR REPLACE FUNCTION getdate
RETURN DATE
AS
BEGIN
RETURN SysDate;
END;
/
/** First Of DD/DY/MM/Q */
CREATE OR REPLACE FUNCTION firstOf
(
p_date DATE,
p_datePart VARCHAR2
)
RETURN DATE
AS
BEGIN
RETURN TRUNC(p_date, p_datePart);
END;
/
/** Add Number of Days */
CREATE OR REPLACE FUNCTION addDays
(
p_date DATE,
p_days NUMBER
)
RETURN DATE
AS
BEGIN
RETURN TRUNC(p_date) + p_days;
END;
/
CREATE OR REPLACE FUNCTION daysBetween
(
p_date1 DATE,
p_date2 DATE
)
RETURN NUMBER
AS
BEGIN
RETURN (TRUNC(p_date1) - TRUNC(p_date2));
END;
/

View File

@ -0,0 +1,31 @@
# JDBC properties for Oracle10
# Note: Properties starting with "datasource." will be fed into the datasource instance of the
# class configured via the datasource.class property
# Use this property to choose the Oracle10 platform (instead of the Oracle8 default one)
ddlutils.platform=Oracle10
#
# Using the plain DBCP datasource
#
datasource.class=org.apache.commons.dbcp.BasicDataSource
datasource.driverClassName=oracle.jdbc.driver.OracleDriver
datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
datasource.username=adempiere
datasource.password=adempiere
#
# Or the Oracle datasource
#
#datasource.class=oracle.jdbc.pool.OracleDataSource
#datasource.URL=jdbc:oracle:thin:@leesf:1521:orcl
#datasource.user=adempiere
#datasource.password=adempiere
#datasource.connectionCachingEnabled=true
# For oracle, we should limit the schema to the one of the user
# Note that Oracle requires this to be uppercase, even when using delimited identifiers
ddlutils.schema=ADEMPIERE

View File

@ -0,0 +1,2 @@
Folder to store log generated from build

View File

@ -0,0 +1,280 @@
CREATE OR REPLACE PROCEDURE AD_Column_Sync
(
p_PInstance_ID IN NUMBER
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: AD_Column_Sync.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Synchronize Column with Database
* Description:
************************************************************************/
AS
-- Logistice
v_ResultStr VARCHAR2(2000);
v_Message VARCHAR2(2000);
v_Result NUMBER := 1; -- 0=failure
v_Record_ID NUMBER;
v_AD_User_ID NUMBER;
-- Parameter
CURSOR Cur_Parameter (pp_PInstance NUMBER) IS
SELECT i.Record_ID, i.AD_User_ID,
p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=pp_PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Parameter Variables
-- Variables
v_TableName AD_Table.TableName%TYPE;
v_ColumnName AD_Column.ColumnName%TYPE;
v_AD_Reference_ID AD_Column.AD_Reference_ID%TYPE;
v_FieldLength AD_Column.FieldLength%TYPE;
v_DefaultValue AD_Column.DefaultValue%TYPE;
v_IsMandatory AD_Column.IsMandatory%TYPE;
--
v_DB_DataType USER_TAB_COLUMNS.DATA_TYPE%TYPE;
v_Cmd VARCHAR2(255);
v_DB_TableName VARCHAR(60) := NULL;
BEGIN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID);
v_ResultStr := 'PInstanceNotFound';
UPDATE AD_PInstance
SET Created = SysDate,
IsProcessing = 'Y'
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
-- Get Parameters
v_ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (p_PInstance_ID) LOOP
v_Record_ID := p.Record_ID;
v_AD_User_ID := p.AD_User_ID;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || v_Record_ID);
-- Get Table/Column Info
v_ResultStr := 'ReadingColumnInfo';
SELECT t.TableName, c.ColumnName, c.AD_Reference_ID, c.FieldLength,
c.DefaultValue, c.IsMandatory
INTO v_TableName, v_ColumnName, v_AD_Reference_ID, v_FieldLength,
v_DefaultValue, v_IsMandatory
FROM AD_Table t, AD_Column c
WHERE t.AD_Table_ID = c.AD_Table_ID
AND c.AD_Column_ID = v_Record_ID;
-- Check if Table exists
v_ResultStr := 'ReadingDBTableInfo';
BEGIN
SELECT Table_Name
INTO v_DB_TableName
FROM USER_TABLES
WHERE Table_Name=UPPER(v_TableName);
EXCEPTION
WHEN OTHERS THEN NULL;
END;
-- Table does not exists
IF (v_DB_TableName IS NULL) THEN
v_ResultStr := 'CreateTableCommand';
BEGIN
v_CMD := 'CREATE TABLE ' || SYS_CONTEXT('USERENV', 'CURRENT_USER') || '.'
|| UPPER(v_TableName) || ' (XXXX CHAR(1))';
EXECUTE IMMEDIATE v_Cmd;
EXCEPTION
WHEN OTHERS THEN
v_Result := 0; -- failure
v_Message := 'Error: ' || SQLERRM || ' - Command: ' || v_Cmd;
GOTO FINISH_PROCESS;
END;
END IF;
-- Get Data Dictionary Info
v_ResultStr := 'ReadingDBColumnInfo';
BEGIN
SELECT DATA_TYPE --, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, DATA_DEFAULT
INTO v_DB_DataType
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME=UPPER(v_TableName)
AND COLUMN_NAME=UPPER(v_ColumnName);
EXCEPTION
WHEN OTHERS THEN NULL;
END;
/**
* Create Column in Database
*/
IF (v_DB_DataType IS NULL) THEN
v_ResultStr := 'CreateALTERCommand';
BEGIN
-- Get TableName
v_Cmd := 'ALTER TABLE ' || v_TableName || ' ADD ' || v_ColumnName || ' ';
-- Map Data Type
IF (v_AD_Reference_ID IN (10,14)) THEN
-- String, Text
v_Cmd := v_Cmd || 'VARCHAR2(' || v_FieldLength || ')';
ELSIF (v_AD_Reference_ID IN (17,20,28)) THEN
-- List,YesNo,Button
v_Cmd := v_Cmd || 'CHAR(' || v_FieldLength || ')';
ELSIF (v_AD_Reference_ID IN (13,18,19,21,25,27,30,31)) THEN
-- ID,Table,TableDir,Location,Account,Color,Search,Locator
v_Cmd := v_Cmd || 'NUMBER(10)';
ELSIF (v_AD_Reference_ID IN (11,12,22,29)) THEN
-- Integer,Amount,Number,Quantity
v_Cmd := v_Cmd || 'NUMBER';
ELSIF (v_AD_Reference_ID IN (15,16)) THEN
-- Date,DateTime
v_Cmd := v_Cmd || 'DATE';
ELSE -- 23-Binary, 24-Radio, 26-RowID, 32-Image
v_Result := 0; -- failure
v_Message := 'DisplayType Not Supported';
END IF;
-- Default (literal)
IF (v_DefaultValue IS NOT NULL AND LENGTH(v_DefaultValue) <> 0) THEN
IF (v_AD_Reference_ID IN (10,14,17,20,28)) THEN
v_Cmd := v_Cmd || ' DEFAULT (''' || v_DefaultValue || ''')';
ELSE
v_Cmd := v_Cmd || ' DEFAULT ' || v_DefaultValue;
END IF;
END IF;
-- Mandatory
IF (v_IsMandatory = 'Y') THEN
IF (v_DefaultValue IS NULL OR LENGTH(v_DefaultValue) = 0) THEN
v_Result := 0; -- failure
v_Message := 'Mandatory requites literal default value';
ELSE
v_Cmd := v_Cmd || ' NOT NULL';
END IF;
END IF;
-- Execute it
IF (v_Result = 1) THEN
EXECUTE IMMEDIATE v_Cmd;
v_Message := '@Created@ - ' || v_Cmd;
END IF;
EXCEPTION
WHEN OTHERS THEN
v_Result := 0; -- failure
v_Message := 'Error: ' || SQLERRM || ' - Command: ' || v_Cmd;
END;
/**
* Change certain Attributes
*/
ELSE
v_ResultStr := 'CreateALTERCommand';
BEGIN
-- Get TableName
v_Cmd := 'ALTER TABLE ' || v_TableName || ' MODIFY ' || v_ColumnName || ' ';
-- Map Data Type
IF (v_AD_Reference_ID IN (10,14)) THEN
-- String, Text
v_Cmd := v_Cmd || 'VARCHAR2(' || v_FieldLength || ')';
ELSIF (v_AD_Reference_ID IN (17,20,28)) THEN
-- List,YesNo,Button
v_Cmd := v_Cmd || 'CHAR(' || v_FieldLength || ')';
ELSIF (v_AD_Reference_ID IN (13,18,19,21,25,27,30,31)) THEN
-- ID,Table,TableDir,Location,Account,Color,Search,Locator
v_Cmd := v_Cmd || 'NUMBER(10)';
ELSIF (v_AD_Reference_ID IN (11,12,22,29)) THEN
-- Integer,Amount,Number,Quantity
v_Cmd := v_Cmd || 'NUMBER';
ELSIF (v_AD_Reference_ID IN (15,16)) THEN
-- Date,DateTime
v_Cmd := v_Cmd || 'DATE';
ELSE -- 23-Binary, 24-Radio, 26-RowID, 32-Image
v_Result := 0; -- failure
v_Message := 'DisplayType Not Supported';
END IF;
-- Default (literal)
IF (v_DefaultValue IS NOT NULL AND LENGTH(v_DefaultValue) <> 0) THEN
IF (v_AD_Reference_ID IN (10,14,17,20,28)) THEN
v_Cmd := v_Cmd || ' DEFAULT (''' || v_DefaultValue || ''')';
ELSE
v_Cmd := v_Cmd || ' DEFAULT ' || v_DefaultValue;
END IF;
END IF;
-- Mandatory
IF (v_IsMandatory = 'Y') THEN
IF (v_DefaultValue IS NULL OR LENGTH(v_DefaultValue) = 0) THEN
v_Result := 0; -- failure
v_Message := 'Mandatory requites literal default value';
ELSE
v_Cmd := v_Cmd || ' NOT NULL';
END IF;
END IF;
-- Execute it
IF (v_Result = 1) THEN
EXECUTE IMMEDIATE v_Cmd;
v_Message := '@Updated@ - ' || v_Cmd;
END IF;
EXCEPTION
WHEN OTHERS THEN
v_Result := 0; -- failure
v_Message := 'Error: ' || SQLERRM || ' - Command: ' || v_Cmd;
END;
END IF;
/**
* Delete Column
*
ELSE
v_Cmd := 'ALTER TABLE ' || v_TableName
|| ' DROP COLUMN ' || v_ColumnName;
-- Execute it
EXECUTE IMMEDIATE v_Cmd;
END IF;
/**/
-- Table did not exist - drop initial column
IF (v_DB_TableName IS NULL) THEN
v_ResultStr := 'CreateDropXXColumnCommand';
BEGIN
v_CMD := 'ALTER TABLE ' || v_TableName || ' DROP COLUMN XXXX';
EXECUTE IMMEDIATE v_Cmd;
EXCEPTION
WHEN OTHERS THEN
v_Result := 0; -- failure
v_Message := 'Error: ' || SQLERRM || ' - Command: ' || v_Cmd;
END;
END IF;
<<FINISH_PROCESS>>
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = v_Result, -- 1=success
ErrorMsg = v_Message
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
v_ResultStr := v_ResultStr || ': ' || SQLERRM || ' - ' || v_Message;
DBMS_OUTPUT.PUT_LINE(v_ResultStr);
ROLLBACK;
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = v_ResultStr
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
RETURN;
END AD_Column_Sync;
/

View File

@ -0,0 +1,92 @@
CREATE OR REPLACE PROCEDURE AD_PrintPaper_Default
(
p_AD_PInstance_ID IN NUMBER
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: AD_PrintPaper_Default.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Set Current Format as Default
* Description:
************************************************************************/
AS
-- Logistice
v_ResultStr VARCHAR2(2000);
v_Message VARCHAR2(2000);
p_Record_ID NUMBER;
-- Parameter
CURSOR Cur_Parameter (PInstance NUMBER) IS
SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Parameter Variables
p_AD_Client_ID NUMBER := NULL;
BEGIN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_AD_PInstance_ID);
v_ResultStr := 'PInstanceNotFound';
UPDATE AD_PInstance
SET Created = SysDate,
IsProcessing = 'Y'
WHERE AD_PInstance_ID=p_AD_PInstance_ID;
COMMIT;
-- Get Parameters
v_ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (p_AD_PInstance_ID) LOOP
p_Record_ID := p.Record_ID;
IF (p.ParameterName = 'AD_Client_ID') THEN
p_AD_Client_ID := p.P_Number;
DBMS_OUTPUT.PUT_LINE(' AD_Client_ID=' || p_AD_Client_ID);
ELSE
DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
END IF;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || p_Record_ID);
v_ResultStr := 'Updating';
UPDATE AD_PrintFormat pf
SET AD_PrintPaper_ID = p_Record_ID
WHERE (AD_Client_ID = p_AD_Client_ID OR p_AD_Client_ID IS NULL)
AND EXISTS (SELECT * FROM AD_PrintPaper pp
WHERE pf.AD_PrintPaper_ID=pp.AD_PrintPaper_ID
AND IsLandscape = (SELECT IsLandscape FROM AD_PrintPaper
WHERE AD_PrintPaper_ID=p_Record_ID));
v_Message := '@Copied@=' || SQL%ROWCOUNT;
<<FINISH_PROCESS>>
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 1, -- success
ErrorMsg = v_Message
WHERE AD_PInstance_ID=p_AD_PInstance_ID;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
v_ResultStr := v_ResultStr || ': ' || SQLERRM || ' - ' || v_Message;
DBMS_OUTPUT.PUT_LINE(v_ResultStr);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = v_ResultStr
WHERE AD_PInstance_ID=p_AD_PInstance_ID;
COMMIT;
RETURN;
END AD_PrintPaper_Default;
/

View File

@ -0,0 +1,56 @@
CREATE OR REPLACE PROCEDURE AD_Sequence_Doc
(
p_SequenceName IN VARCHAR2,
p_AD_Client_ID IN NUMBER,
o_DocumentNo OUT VARCHAR2
)
AS
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: AD_Sequence_Doc.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Get the next DocumentNo of TableName
* Description:
* store in parameter o_DocumentNo
* if ID < 1000000, use System Doc Sequence
************************************************************************/
v_NextNo NUMBER;
v_NextNoSys NUMBER;
v_Prefix VARCHAR2(30);
v_Suffix VARCHAR2(30);
BEGIN
SELECT CurrentNext, CurrentNextSys, Prefix, Suffix
INTO v_NextNo, v_NextNoSys, v_Prefix, v_Suffix
FROM AD_Sequence
WHERE Name = p_SequenceName
AND IsActive = 'Y'
AND IsTableID = 'N'
AND IsAutoSequence = 'Y'
AND AD_Client_ID = p_AD_Client_ID
FOR UPDATE OF CurrentNext, CurrentNextSys;
IF (v_NextNoSys <> -1 AND p_AD_Client_ID < 1000000) THEN -- System No
UPDATE AD_Sequence
SET CurrentNextSys = CurrentNextSys + IncrementNo,
Updated = SysDate
WHERE Name = p_SequenceName;
o_DocumentNo := NVL(v_Prefix, '') || v_NextNoSys || NVL(v_Suffix, '');
ELSE -- Standard No
UPDATE AD_Sequence
SET CurrentNext = CurrentNext + IncrementNo,
Updated = SysDate
WHERE Name = p_SequenceName;
o_DocumentNo := NVL(v_Prefix, '') || v_NextNo || NVL(v_Suffix, '');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20100, 'Document Sequence not found - ' || p_SequenceName);
END AD_Sequence_Doc;
/

View File

@ -0,0 +1,80 @@
CREATE OR REPLACE PROCEDURE AD_Sequence_DocType
(
p_DocType_ID IN NUMBER,
p_ID IN NUMBER,
p_DocumentNo OUT VARCHAR2
)
AS
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: AD_Sequence_DocType.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Get the next DocumentNo of Document Type
* Description:
* store in parameter p_DocumentNo
* If ID < 1000000, use System Doc Sequence
* If no Document Sequence is defined, return null !
* Use AD_Sequence_Doc('DocumentNo_myTable',.. to get it directly
************************************************************************/
v_NextNo NUMBER;
v_NextNoSys NUMBER;
v_Sequence_ID NUMBER := NULL;
v_Prefix VARCHAR2(30);
v_Suffix VARCHAR2(30);
BEGIN
-- Is a document Sequence defined and valid?
BEGIN
SELECT DocNoSequence_ID
INTO v_Sequence_ID
FROM C_DocType
WHERE C_DocType_ID=p_DocType_ID -- parameter
AND IsDocNoControlled='Y'
AND IsActive='Y';
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
IF (v_Sequence_ID IS NULL) THEN -- No Sequence Number
p_DocumentNo := ''; -- Return NULL
DBMS_OUTPUT.PUT_LINE('[AD_Sequence_DocType: not found - C_DocType_ID=' || p_DocType_ID || ']');
RETURN;
END IF;
-- Get the numbers
SELECT s.AD_Sequence_ID, s.CurrentNext, s.CurrentNextSys, s.Prefix, s.Suffix
INTO v_Sequence_ID, v_NextNo, v_NextNoSys, v_Prefix, v_Suffix
FROM C_DocType d, AD_Sequence s
WHERE d.C_DocType_ID=p_DocType_ID -- parameter
AND d.DocNoSequence_ID=s.AD_Sequence_ID
AND s.IsActive = 'Y'
AND s.IsTableID = 'N'
AND s.IsAutoSequence = 'Y'
FOR UPDATE OF CurrentNext, CurrentNextSys;
IF (v_NextNoSys <> -1 AND p_ID < 1000000) THEN -- System No
UPDATE AD_Sequence
SET CurrentNextSys = CurrentNextSys + IncrementNo
WHERE AD_Sequence_ID = v_Sequence_ID;
p_DocumentNo := NVL(v_Prefix, '') || v_NextNoSys || NVL(v_Suffix, '');
ELSE -- Standard No
UPDATE AD_Sequence
SET CurrentNext = CurrentNext + IncrementNo
WHERE AD_Sequence_ID = v_Sequence_ID;
p_DocumentNo := NVL(v_Prefix, '') || v_NextNo || NVL(v_Suffix, '');
END IF;
-- DBMS_OUTPUT.PUT_LINE(p_DocumentNo);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20100, 'AD_Sequence_DocType: not found - DocType_ID='
|| p_DocType_ID || ', Sequence_ID=' || v_Sequence_ID);
END AD_Sequence_DocType;
/

View File

@ -0,0 +1,56 @@
CREATE OR REPLACE PROCEDURE AD_Sequence_Next
(
p_TableName IN VARCHAR2,
p_ID IN NUMBER,
p_NextNo OUT NUMBER
)
AS
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: AD_Sequence_Next.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Get the next sequence number of TableName
* Description:
* store in parameter p_NextNo
* if ID < 1000000, use System Doc Sequence
************************************************************************/
v_NextNoSys NUMBER;
v_ResultStr VARCHAR(255);
BEGIN
v_ResultStr := 'Read';
SELECT CurrentNext, CurrentNextSys
INTO p_NextNo, v_NextNoSys
FROM AD_Sequence
WHERE Name = p_TableName
AND IsActive = 'Y'
AND IsTableID = 'Y'
AND IsAutoSequence = 'Y'
FOR UPDATE OF CurrentNext, CurrentNextSys;
v_ResultStr := 'Write';
IF (v_NextNoSys <> -1 AND p_ID < 1000000) THEN -- System No
UPDATE AD_Sequence
SET CurrentNextSys = CurrentNextSys + IncrementNo,
Updated = SysDate
WHERE Name = p_TableName;
p_NextNo := v_NextNoSys;
ELSE -- Standard No
UPDATE AD_Sequence
SET CurrentNext = CurrentNext + IncrementNo,
Updated = SysDate
WHERE Name = p_TableName;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR (-20100, 'Table Sequence not found ');
-- || v_ResultStr || ': ' || p_TableName);
END AD_Sequence_Next;
/

View File

@ -0,0 +1,775 @@
CREATE OR REPLACE PROCEDURE AD_Synchronize
(
p_PInstance_ID IN NUMBER -- DEFAULT NULL
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2003 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: AD_Syncronize.sql,v 1.2 2006/05/03 00:06:58 jjanke Exp $
***
* Title: Syncronize Application Dictionary
* Description:
* Synchronize Elements
* Update Column and Field with Names from Element and Process
* Update Process Parameters from Elements
* Update Workflow Notes from Windows
* Update Menu from Window/Form/Process/Task
************************************************************************/
AS
-- Logistice
v_ResultStr VARCHAR2(2000);
v_Message VARCHAR2(2000);
v_Result NUMBER := 1; -- 0=failure
v_Record_ID NUMBER;
v_AD_User_ID NUMBER;
-- Parameter
CURSOR Cur_Parameter (pp_PInstance NUMBER) IS
SELECT i.Record_ID, i.AD_User_ID,
p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=pp_PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Parameter Variables
BEGIN
IF (p_PInstance_ID IS NOT NULL) THEN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID);
v_ResultStr := 'PInstanceNotFound';
UPDATE AD_PInstance
SET Created = SysDate,
IsProcessing = 'Y'
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
-- Get Parameters
v_ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (p_PInstance_ID) LOOP
v_Record_ID := p.Record_ID;
v_AD_User_ID := p.AD_User_ID;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || v_Record_ID);
END IF;
---------------------------------------------------------------------------
DBMS_OUTPUT.PUT_LINE('Adding missing Elements');
DECLARE
NextNo NUMBER;
CURSOR Cur_Column IS
SELECT DISTINCT ColumnName, Name, Description, Help, EntityType
FROM AD_Column c
WHERE NOT EXISTS
(SELECT * FROM AD_Element e
WHERE UPPER(c.ColumnName)=UPPER(e.ColumnName));
CURSOR Cur_Process IS
SELECT DISTINCT ColumnName, Name, Description, Help, EntityType
FROM AD_Process_Para p
WHERE NOT EXISTS
(SELECT * FROM AD_Element e
WHERE UPPER(p.ColumnName)=UPPER(e.ColumnName));
CC Cur_Column%ROWTYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE('Column:');
FOR CC IN Cur_Column LOOP
AD_Sequence_Next('AD_Element', 0, NextNo); -- get ID
INSERT INTO AD_ELEMENT
(AD_ELEMENT_ID, AD_CLIENT_ID, AD_ORG_ID,
ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY,
ColumnName, Name, PrintName, Description, Help, EntityType)
VALUES
(NextNo, 0, 0,
'Y', SysDate, 0, SysDate, 0,
CC.ColumnName, CC.Name, CC.Name, CC.Description, CC.Help, CC.EntityType);
DBMS_OUTPUT.PUT_LINE(' added ' || cc.ColumnName);
COMMIT;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Parameter:');
FOR CC IN Cur_Process LOOP
AD_Sequence_Next('AD_Element', 0, NextNo); -- get ID
INSERT INTO AD_ELEMENT
(AD_ELEMENT_ID, AD_CLIENT_ID, AD_ORG_ID,
ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY,
ColumnName, Name, PrintName, Description, Help, EntityType)
VALUES
(NextNo, 0, 0,
'Y', SysDate, 0, SysDate, 0,
CC.ColumnName, CC.Name, CC.Name, CC.Description, CC.Help, CC.EntityType);
DBMS_OUTPUT.PUT_LINE(' added ' || cc.ColumnName);
COMMIT;
END LOOP;
END;
DBMS_OUTPUT.PUT_LINE('Adding missing Element Translations');
INSERT INTO AD_Element_Trl (AD_Element_ID, AD_Language, AD_Client_ID, AD_Org_ID,
IsActive, Created, CreatedBy, Updated, UpdatedBy,
Name, PrintName, Description, Help, IsTranslated)
SELECT m.AD_Element_ID, l.AD_Language, m.AD_Client_ID, m.AD_Org_ID,
m.IsActive, m.Created, m.CreatedBy, m.Updated, m.UpdatedBy,
m.Name, m.PrintName, m.Description, m.Help, 'N'
FROM AD_Element m, AD_Language l
WHERE l.IsActive = 'Y' AND l.IsSystemLanguage = 'Y'
AND AD_Element_ID || AD_Language NOT IN
(SELECT AD_Element_ID || AD_Language FROM AD_Element_Trl);
DBMS_OUTPUT.PUT_LINE(' rows added: ' || SQL%ROWCOUNT);
DBMS_OUTPUT.PUT_LINE('Creating link from Element to Column');
UPDATE AD_Column c
SET AD_Element_id =
(SELECT AD_Element_ID FROM AD_Element e
WHERE UPPER(c.ColumnName)=UPPER(e.ColumnName))
WHERE AD_Element_ID IS NULL;
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
COMMIT;
DBMS_OUTPUT.PUT_LINE('Deleting unused Elements');
DELETE AD_Element_Trl
WHERE AD_Element_ID IN
(SELECT AD_Element_ID FROM AD_Element e
WHERE NOT EXISTS
(SELECT * FROM AD_Column c WHERE UPPER(e.ColumnName)=UPPER(c.ColumnName))
AND NOT EXISTS
(SELECT * FROM AD_Process_Para p WHERE UPPER(e.ColumnName)=UPPER(p.ColumnName)));
DELETE AD_Element e
WHERE NOT EXISTS
(SELECT * FROM AD_Column c WHERE UPPER(e.ColumnName)=UPPER(c.ColumnName))
AND NOT EXISTS
(SELECT * FROM AD_Process_Para p WHERE UPPER(e.ColumnName)=UPPER(p.ColumnName));
DBMS_OUTPUT.PUT_LINE(' rows deleted: ' || SQL%ROWCOUNT);
---------------------------------------------------------------------------
-- Columns
DBMS_OUTPUT.PUT_LINE('Synchronize Column');
/* Identify offending column
SELECT UPPER(ColumnName)
FROM AD_Element
GROUP BY UPPER(ColumnName)
HAVING COUNT(UPPER(ColumnName)) > 1
SELECT c.ColumnName, e.ColumnName
FROM AD_Column c
INNER JOIN AD_Element e ON (c.AD_Element_ID=e.AD_Element_ID)
WHERE c.ColumnName <> e.ColumnName
*/
UPDATE AD_Column c
SET (ColumnName, Name, Description, Help) =
(SELECT ColumnName, Name, Description, Help
FROM AD_Element e WHERE c.AD_Element_ID=e.AD_Element_ID),
Updated = SysDate
WHERE EXISTS (SELECT * FROM AD_Element e
WHERE c.AD_Element_ID=e.AD_Element_ID
AND (c.ColumnName <> e.ColumnName OR c.Name <> e.Name
OR NVL(c.Description,' ') <> NVL(e.Description,' ') OR NVL(c.Help,' ') <> NVL(e.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Fields should now be syncronized
DBMS_OUTPUT.PUT_LINE('Synchronize Field');
UPDATE AD_Field f
SET (Name, Description, Help) =
(SELECT e.Name, e.Description, e.Help
FROM AD_Element e, AD_Column c
WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),
Updated = SysDate
WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND EXISTS (SELECT * FROM AD_Element e, AD_Column c
WHERE f.AD_Column_ID=c.AD_Column_ID
AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL
AND (f.Name <> e.Name OR NVL(f.Description,' ') <> NVL(e.Description,' ') OR NVL(f.Help,' ') <> NVL(e.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Field Translations
DBMS_OUTPUT.PUT_LINE('Synchronize Field Translations');
UPDATE AD_Field_trl trl
SET Name = (SELECT e.Name FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
Description = (SELECT e.Description FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
Help = (SELECT e.Help FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
IsTranslated = (SELECT e.IsTranslated FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
Updated = SysDate
WHERE EXISTS (SELECT * FROM AD_Field f, AD_Element_trl e, AD_Column c
WHERE trl.AD_Field_ID=f.AD_Field_ID
AND f.AD_Column_ID=c.AD_Column_ID
AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL
AND trl.AD_Language=e.AD_Language
AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND (trl.Name <> e.Name OR NVL(trl.Description,' ') <> NVL(e.Description,' ') OR NVL(trl.Help,' ') <> NVL(e.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Fields should now be syncronized
DBMS_OUTPUT.PUT_LINE('Synchronize PO Field');
UPDATE AD_Field f
SET Name = (SELECT e.PO_Name FROM AD_Element e, AD_Column c
WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),
Description = (SELECT e.PO_Description FROM AD_Element e, AD_Column c
WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),
Help = (SELECT e.PO_Help FROM AD_Element e, AD_Column c
WHERE e.AD_Element_ID=c.AD_Element_ID AND c.AD_Column_ID=f.AD_Column_ID),
Updated = SysDate
WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND EXISTS (SELECT * FROM AD_Element e, AD_Column c
WHERE f.AD_Column_ID=c.AD_Column_ID
AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL
AND (f.Name <> e.PO_Name OR NVL(f.Description,' ') <> NVL(e.PO_Description,' ') OR NVL(f.Help,' ') <> NVL(e.PO_Help,' '))
AND e.PO_Name IS NOT NULL)
AND EXISTS (SELECT * FROM AD_Tab t, AD_Window w
WHERE f.AD_Tab_ID=t.AD_Tab_ID
AND t.AD_Window_ID=w.AD_Window_ID
AND w.IsSOTrx='N');
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Field Translations
DBMS_OUTPUT.PUT_LINE('Synchronize PO Field Translations');
UPDATE AD_Field_trl trl
SET Name = (SELECT e.PO_Name FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
Description = (SELECT e.PO_Description FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
Help = (SELECT e.PO_Help FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
IsTranslated = (SELECT e.IsTranslated FROM AD_Element_trl e, AD_Column c, AD_Field f
WHERE e.AD_Language=trl.AD_Language AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=f.AD_Column_ID AND f.AD_Field_ID=trl.AD_Field_ID),
Updated = SysDate
WHERE EXISTS (SELECT * FROM AD_Field f, AD_Element_trl e, AD_Column c
WHERE trl.AD_Field_ID=f.AD_Field_ID
AND f.AD_Column_ID=c.AD_Column_ID
AND c.AD_Element_ID=e.AD_Element_ID AND c.AD_Process_ID IS NULL
AND trl.AD_Language=e.AD_Language
AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND (trl.Name <> e.PO_Name OR NVL(trl.Description,' ') <> NVL(e.PO_Description,' ') OR NVL(trl.Help,' ') <> NVL(e.PO_Help,' '))
AND e.PO_Name IS NOT NULL)
AND EXISTS (SELECT * FROM AD_Field f, AD_Tab t, AD_Window w
WHERE trl.AD_Field_ID=f.AD_Field_ID
AND f.AD_Tab_ID=t.AD_Tab_ID
AND t.AD_Window_ID=w.AD_Window_ID
AND w.IsSOTrx='N');
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Fields from Process
DBMS_OUTPUT.PUT_LINE('Synchronize Field from Process');
UPDATE AD_Field f
SET Name = (SELECT p.Name FROM AD_Process p, AD_Column c WHERE p.AD_Process_ID=c.AD_Process_ID
AND c.AD_Column_ID=f.AD_Column_ID),
Description = (SELECT p.Description FROM AD_Process p, AD_Column c WHERE p.AD_Process_ID=c.AD_Process_ID
AND c.AD_Column_ID=f.AD_Column_ID),
Help = (SELECT p.Help FROM AD_Process p, AD_Column c WHERE p.AD_Process_ID=c.AD_Process_ID
AND c.AD_Column_ID=f.AD_Column_ID),
Updated = SysDate
WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND EXISTS (SELECT * FROM AD_Process p, AD_Column c
WHERE c.AD_Process_ID=p.AD_Process_ID AND f.AD_Column_ID=c.AD_Column_ID
AND (f.Name<>p.Name OR NVL(f.Description,' ')<>NVL(p.Description,' ') OR NVL(f.Help,' ')<>NVL(p.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Field Translations from Process
DBMS_OUTPUT.PUT_LINE('Synchronize Field Trl from Process Trl');
UPDATE AD_Field_trl trl
SET Name = (SELECT p.Name FROM AD_Process_trl p, AD_Column c, AD_Field f
WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID
AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language),
Description = (SELECT p.Description FROM AD_Process_trl p, AD_Column c, AD_Field f
WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID
AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language),
Help = (SELECT p.Help FROM AD_Process_trl p, AD_Column c, AD_Field f
WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID
AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language),
IsTranslated = (SELECT p.IsTranslated FROM AD_Process_trl p, AD_Column c, AD_Field f
WHERE p.AD_Process_ID=c.AD_Process_ID AND c.AD_Column_ID=f.AD_Column_ID
AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language),
Updated = SysDate
WHERE EXISTS (SELECT * FROM AD_Process_Trl p, AD_Column c, AD_Field f
WHERE c.AD_Process_ID=p.AD_Process_ID AND f.AD_Column_ID=c.AD_Column_ID
AND f.AD_Field_ID=trl.AD_Field_ID AND p.AD_Language=trl.AD_Language
AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND (trl.Name<>p.Name OR NVL(trl.Description,' ')<>NVL(p.Description,' ') OR NVL(trl.Help,' ')<>NVL(p.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Sync Parameter ColumnName
UPDATE AD_Process_Para f
SET ColumnName = (SELECT e.ColumnName FROM AD_Element e
WHERE UPPER(e.ColumnName)=UPPER(f.ColumnName))
WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND EXISTS (SELECT * FROM AD_Element e
WHERE UPPER(e.ColumnName)=UPPER(f.ColumnName)
AND e.ColumnName<>f.ColumnName);
-- Paramenter Fields
UPDATE AD_Process_Para p
SET IsCentrallyMaintained = 'N'
WHERE IsCentrallyMaintained <> 'N'
AND NOT EXISTS (SELECT * FROM AD_Element e WHERE p.ColumnName=e.ColumnName);
-- Parameter Fields
DBMS_OUTPUT.PUT_LINE('Synchronize Process Parameter');
UPDATE AD_Process_Para f
SET Name = (SELECT e.Name FROM AD_Element e
WHERE e.ColumnName=f.ColumnName),
Description = (SELECT e.Description FROM AD_Element e
WHERE e.ColumnName=f.ColumnName),
Help = (SELECT e.Help FROM AD_Element e
WHERE e.ColumnName=f.ColumnName),
Updated = SysDate
WHERE f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND EXISTS (SELECT * FROM AD_Element e
WHERE e.ColumnName=f.ColumnName
AND (f.Name <> e.Name OR NVL(f.Description,' ') <> NVL(e.Description,' ') OR NVL(f.Help,' ') <> NVL(e.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Parameter Translations
DBMS_OUTPUT.PUT_LINE('Synchronize Process Parameter Trl');
UPDATE AD_Process_Para_Trl trl
SET Name = (SELECT et.Name FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),
Description = (SELECT et.Description FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),
Help = (SELECT et.Help FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),
IsTranslated = (SELECT et.IsTranslated FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID),
Updated = SysDate
WHERE EXISTS (SELECT * FROM AD_Element_Trl et, AD_Element e, AD_Process_Para f
WHERE et.AD_Language=trl.AD_Language AND et.AD_Element_ID=e.AD_Element_ID
AND e.ColumnName=f.ColumnName AND f.AD_Process_Para_ID=trl.AD_Process_Para_ID
AND f.IsCentrallyMaintained='Y' AND f.IsActive='Y'
AND (trl.Name <> et.Name OR NVL(trl.Description,' ') <> NVL(et.Description,' ') OR NVL(trl.Help,' ') <> NVL(et.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Workflow Node - Window
DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node from Window');
UPDATE AD_WF_Node n
SET Name = (SELECT w.Name FROM AD_Window w
WHERE w.AD_Window_ID=n.AD_Window_ID),
Description = (SELECT w.Description FROM AD_Window w
WHERE w.AD_Window_ID=n.AD_Window_ID),
Help = (SELECT w.Help FROM AD_Window w
WHERE w.AD_Window_ID=n.AD_Window_ID)
WHERE n.IsCentrallyMaintained = 'Y'
AND EXISTS (SELECT * FROM AD_Window w
WHERE w.AD_Window_ID=n.AD_Window_ID
AND (w.Name <> n.Name OR NVL(w.Description,' ') <> NVL(n.Description,' ') OR NVL(w.Help,' ') <> NVL(n.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Workflow Translations - Window
DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node Trl from Window Trl');
UPDATE AD_WF_Node_Trl trl
SET Name = (SELECT t.Name FROM AD_Window_trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID
AND trl.AD_Language=t.AD_Language),
Description = (SELECT t.Description FROM AD_Window_trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID
AND trl.AD_Language=t.AD_Language),
Help = (SELECT t.Help FROM AD_Window_trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID
AND trl.AD_Language=t.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Window_Trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Window_ID=t.AD_Window_ID
AND trl.AD_Language=t.AD_Language AND n.IsCentrallyMaintained='Y' AND n.IsActive='Y'
AND (trl.Name <> t.Name OR NVL(trl.Description,' ') <> NVL(t.Description,' ') OR NVL(trl.Help,' ') <> NVL(t.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Workflow Node - Form
DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node from Form');
UPDATE AD_WF_Node n
SET (Name, Description, Help) = (SELECT f.Name, f.Description, f.Help
FROM AD_Form f
WHERE f.AD_Form_ID=n.AD_Form_ID)
WHERE n.IsCentrallyMaintained = 'Y'
AND EXISTS (SELECT * FROM AD_Form f
WHERE f.AD_Form_ID=n.AD_Form_ID
AND (f.Name <> n.Name OR NVL(f.Description,' ') <> NVL(n.Description,' ') OR NVL(f.Help,' ') <> NVL(n.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Workflow Translations - Form
DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node Trl from Form Trl');
UPDATE AD_WF_Node_Trl trl
SET (Name, Description, Help) = (SELECT t.Name, t.Description, t.Help
FROM AD_Form_trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Form_ID=t.AD_Form_ID
AND trl.AD_Language=t.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Form_Trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Form_ID=t.AD_Form_ID
AND trl.AD_Language=t.AD_Language AND n.IsCentrallyMaintained='Y' AND n.IsActive='Y'
AND (trl.Name <> t.Name OR NVL(trl.Description,' ') <> NVL(t.Description,' ') OR NVL(trl.Help,' ') <> NVL(t.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Workflow Node - Report
DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node from Process');
UPDATE AD_WF_Node n
SET (Name, Description, Help) = (SELECT f.Name, f.Description, f.Help
FROM AD_Process f
WHERE f.AD_Process_ID=n.AD_Process_ID)
WHERE n.IsCentrallyMaintained = 'Y'
AND EXISTS (SELECT * FROM AD_Process f
WHERE f.AD_Process_ID=n.AD_Process_ID
AND (f.Name <> n.Name OR NVL(f.Description,' ') <> NVL(n.Description,' ') OR NVL(f.Help,' ') <> NVL(n.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Workflow Translations - Form
DBMS_OUTPUT.PUT_LINE('Synchronize Workflow Node Trl from Process Trl');
UPDATE AD_WF_Node_Trl trl
SET (Name, Description, Help) = (SELECT t.Name, t.Description, t.Help
FROM AD_Process_trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Process_ID=t.AD_Process_ID
AND trl.AD_Language=t.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Process_Trl t, AD_WF_Node n
WHERE trl.AD_WF_Node_ID=n.AD_WF_Node_ID AND n.AD_Process_ID=t.AD_Process_ID
AND trl.AD_Language=t.AD_Language AND n.IsCentrallyMaintained='Y' AND n.IsActive='Y'
AND (trl.Name <> t.Name OR NVL(trl.Description,' ') <> NVL(t.Description,' ') OR NVL(trl.Help,' ') <> NVL(t.Help,' ')));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
-- Need centrally maintained flag here!
DBMS_OUTPUT.PUT_LINE('Synchronize PrintFormatItem Name from Element');
UPDATE AD_PrintFormatItem pfi
SET Name = (SELECT e.Name
FROM AD_Element e, AD_Column c
WHERE e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=pfi.AD_Column_ID)
WHERE pfi.IsCentrallyMaintained='Y'
AND EXISTS (SELECT *
FROM AD_Element e, AD_Column c
WHERE e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=pfi.AD_Column_ID
AND e.Name<>pfi.Name)
AND EXISTS (SELECT * FROM AD_Client
WHERE AD_Client_ID=pfi.AD_Client_ID AND IsMultiLingualDocument='Y');
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
DBMS_OUTPUT.PUT_LINE('Synchronize PrintFormatItem PrintName from Element');
UPDATE AD_PrintFormatItem pfi
SET PrintName = (SELECT e.PrintName
FROM AD_Element e, AD_Column c
WHERE e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=pfi.AD_Column_ID)
WHERE pfi.IsCentrallyMaintained='Y'
AND EXISTS (SELECT *
FROM AD_Element e, AD_Column c, AD_PrintFormat pf
WHERE e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=pfi.AD_Column_ID
AND LENGTH(pfi.PrintName) > 0
AND e.PrintName<>pfi.PrintName
AND pf.AD_PrintFormat_ID=pfi.AD_PrintFormat_ID
AND pf.IsForm='N' AND IsTableBased='Y')
AND EXISTS (SELECT * FROM AD_Client
WHERE AD_Client_ID=pfi.AD_Client_ID AND IsMultiLingualDocument='Y');
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
DBMS_OUTPUT.PUT_LINE('Synchronize PrintFormatItem Trl from Element Trl (Multi-Lingual)');
UPDATE AD_PrintFormatItem_Trl trl
SET PrintName = (SELECT e.PrintName
FROM AD_Element_Trl e, AD_Column c, AD_PrintFormatItem pfi
WHERE e.AD_Language=trl.AD_Language
AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=pfi.AD_Column_ID
AND pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID)
WHERE EXISTS (SELECT *
FROM AD_Element_Trl e, AD_Column c, AD_PrintFormatItem pfi, AD_PrintFormat pf
WHERE e.AD_Language=trl.AD_Language
AND e.AD_Element_ID=c.AD_Element_ID
AND c.AD_Column_ID=pfi.AD_Column_ID
AND pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID
AND pfi.IsCentrallyMaintained='Y'
AND LENGTH(pfi.PrintName) > 0
AND (e.PrintName<>trl.PrintName OR trl.PrintName IS NULL)
AND pf.AD_PrintFormat_ID=pfi.AD_PrintFormat_ID
AND pf.IsForm='N' AND IsTableBased='Y')
AND EXISTS (SELECT * FROM AD_Client
WHERE AD_Client_ID=trl.AD_Client_ID AND IsMultiLingualDocument='Y');
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
DBMS_OUTPUT.PUT_LINE('Synchronize PrintFormatItem Trl (Not Multi-Lingual)');
UPDATE AD_PrintFormatItem_Trl trl
SET PrintName = (SELECT pfi.PrintName
FROM AD_PrintFormatItem pfi
WHERE pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID)
WHERE EXISTS (SELECT *
FROM AD_PrintFormatItem pfi, AD_PrintFormat pf
WHERE pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID
AND pfi.IsCentrallyMaintained='Y'
AND LENGTH(pfi.PrintName) > 0
AND pfi.PrintName<>trl.PrintName
AND pf.AD_PrintFormat_ID=pfi.AD_PrintFormat_ID
AND pf.IsForm='N' AND pf.IsTableBased='Y')
AND EXISTS (SELECT * FROM AD_Client
WHERE AD_Client_ID=trl.AD_Client_ID AND IsMultiLingualDocument='N');
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
DBMS_OUTPUT.PUT_LINE('Reset PrintFormatItem Trl where not used in base table');
UPDATE AD_PrintFormatItem_Trl trl
SET PrintName = NULL
WHERE PrintName IS NOT NULL
AND EXISTS (SELECT *
FROM AD_PrintFormatItem pfi
WHERE pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID
AND pfi.IsCentrallyMaintained='Y'
AND (LENGTH (pfi.PrintName) = 0 OR pfi.PrintName IS NULL));
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
/**
SELECT e.PrintName "Element", pfi.PrintName "FormatItem", trl.AD_Language, trl.PrintName "Trl"
FROM AD_Element e
INNER JOIN AD_Column c ON (e.AD_Element_ID=c.AD_Element_ID)
INNER JOIN AD_PrintFormatItem pfi ON (c.AD_Column_ID=pfi.AD_Column_ID)
INNER JOIN AD_PrintFormatItem_Trl trl ON (pfi.AD_PrintFormatItem_ID=trl.AD_PrintFormatItem_ID)
WHERE pfi.AD_PrintFormatItem_ID=?
**/
-- Sync Names - Window
DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Window');
UPDATE AD_Menu m
SET Name = (SELECT Name FROM AD_Window w WHERE m.AD_Window_ID=w.AD_Window_ID),
Description = (SELECT Description FROM AD_Window w WHERE m.AD_Window_ID=w.AD_Window_ID)
WHERE AD_Window_ID IS NOT NULL
AND Action = 'W';
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Menu_Trl mt
SET Name = (SELECT wt.Name FROM AD_Window_Trl wt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID
AND mt.AD_Language=wt.AD_Language),
Description = (SELECT wt.Description FROM AD_Window_Trl wt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID
AND mt.AD_Language=wt.AD_Language),
IsTranslated = (SELECT wt.IsTranslated FROM AD_Window_Trl wt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID
AND mt.AD_Language=wt.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Window_Trl wt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Window_ID=wt.AD_Window_ID
AND mt.AD_Language=wt.AD_Language
AND m.AD_Window_ID IS NOT NULL
AND m.Action = 'W');
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
-- Sync Names - Process
DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Processes');
UPDATE AD_Menu m
SET Name = (SELECT p.Name FROM AD_Process p WHERE m.AD_Process_ID=p.AD_Process_ID),
Description = (SELECT p.Description FROM AD_Process p WHERE m.AD_Process_ID=p.AD_Process_ID)
WHERE m.AD_Process_ID IS NOT NULL
AND m.Action IN ('R', 'P');
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Menu_Trl mt
SET Name = (SELECT pt.Name FROM AD_Process_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID
AND mt.AD_Language=pt.AD_Language),
Description = (SELECT pt.Description FROM AD_Process_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID
AND mt.AD_Language=pt.AD_Language),
IsTranslated = (SELECT pt.IsTranslated FROM AD_Process_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID
AND mt.AD_Language=pt.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Process_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Process_ID=pt.AD_Process_ID
AND mt.AD_Language=pt.AD_Language
AND m.AD_Process_ID IS NOT NULL
AND Action IN ('R', 'P'));
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
-- Sync Names = Form
DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Forms');
UPDATE AD_Menu m
SET Name = (SELECT Name FROM AD_Form f WHERE m.AD_Form_ID=f.AD_Form_ID),
Description = (SELECT Description FROM AD_Form f WHERE m.AD_Form_ID=f.AD_Form_ID)
WHERE AD_Form_ID IS NOT NULL
AND Action = 'X';
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Menu_Trl mt
SET Name = (SELECT ft.Name FROM AD_Form_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID
AND mt.AD_Language=ft.AD_Language),
Description = (SELECT ft.Description FROM AD_Form_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID
AND mt.AD_Language=ft.AD_Language),
IsTranslated = (SELECT ft.IsTranslated FROM AD_Form_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID
AND mt.AD_Language=ft.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Form_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Form_ID=ft.AD_Form_ID
AND mt.AD_Language=ft.AD_Language
AND m.AD_Form_ID IS NOT NULL
AND Action = 'X');
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
-- Sync Names - Workflow
DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Workflows');
UPDATE AD_Menu m
SET Name = (SELECT p.Name FROM AD_Workflow p WHERE m.AD_Workflow_ID=p.AD_Workflow_ID),
Description = (SELECT p.Description FROM AD_Workflow p WHERE m.AD_Workflow_ID=p.AD_Workflow_ID)
WHERE m.AD_Workflow_ID IS NOT NULL
AND m.Action = 'F';
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Menu_Trl mt
SET Name = (SELECT pt.Name FROM AD_Workflow_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID
AND mt.AD_Language=pt.AD_Language),
Description = (SELECT pt.Description FROM AD_Workflow_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID
AND mt.AD_Language=pt.AD_Language),
IsTranslated = (SELECT pt.IsTranslated FROM AD_Workflow_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID
AND mt.AD_Language=pt.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Workflow_Trl pt, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Workflow_ID=pt.AD_Workflow_ID
AND mt.AD_Language=pt.AD_Language
AND m.AD_Workflow_ID IS NOT NULL
AND Action = 'F');
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
-- Sync Names = Task
DBMS_OUTPUT.PUT_LINE('Synchronizing Menu with Tasks');
UPDATE AD_Menu m
SET Name = (SELECT Name FROM AD_Task f WHERE m.AD_Task_ID=f.AD_Task_ID),
Description = (SELECT Description FROM AD_Task f WHERE m.AD_Task_ID=f.AD_Task_ID)
WHERE AD_Task_ID IS NOT NULL
AND Action = 'T';
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Menu_Trl mt
SET Name = (SELECT ft.Name FROM AD_Task_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID
AND mt.AD_Language=ft.AD_Language),
Description = (SELECT ft.Description FROM AD_Task_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID
AND mt.AD_Language=ft.AD_Language),
IsTranslated = (SELECT ft.IsTranslated FROM AD_Task_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID
AND mt.AD_Language=ft.AD_Language)
WHERE EXISTS (SELECT * FROM AD_Task_Trl ft, AD_Menu m
WHERE mt.AD_Menu_ID=m.AD_Menu_ID AND m.AD_Task_ID=ft.AD_Task_ID
AND mt.AD_Language=ft.AD_Language
AND m.AD_Task_ID IS NOT NULL
AND Action = 'T');
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
-- Column Name + Element
DBMS_OUTPUT.PUT_LINE('Synchronizing Column with Element');
UPDATE AD_Column c
SET (Name,Description,Help) =
(SELECT e.Name,e.Description,e.Help
FROM AD_Element e WHERE c.AD_Element_ID=e.AD_Element_ID)
WHERE EXISTS
(SELECT * FROM AD_Element e
WHERE c.AD_Element_ID=e.AD_Element_ID
AND c.Name<>e.Name);
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Column_Trl ct
SET Name = (SELECT e.Name
FROM AD_Column c INNER JOIN AD_Element_Trl e ON (c.AD_Element_ID=e.AD_Element_ID)
WHERE ct.AD_Column_ID=c.AD_Column_ID AND ct.AD_Language=e.AD_Language)
WHERE EXISTS
(SELECT * FROM AD_Column c INNER JOIN AD_Element_Trl e ON (c.AD_Element_ID=e.AD_Element_ID)
WHERE ct.AD_Column_ID=c.AD_Column_ID AND ct.AD_Language=e.AD_Language
AND ct.Name<>e.Name);
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
-- Table Name + Element
DBMS_OUTPUT.PUT_LINE('Synchronizing Table with Element');
UPDATE AD_Table t
SET (Name,Description) = (SELECT e.Name,e.Description FROM AD_Element e
WHERE t.TableName||'_ID'=e.ColumnName)
WHERE EXISTS (SELECT * FROM AD_Element e
WHERE t.TableName||'_ID'=e.ColumnName
AND t.Name<>e.Name);
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Table_Trl tt
SET Name = (SELECT e.Name
FROM AD_Table t INNER JOIN AD_Element ex ON (t.TableName||'_ID'=ex.ColumnName)
INNER JOIN AD_Element_Trl e ON (ex.AD_Element_ID=e.AD_Element_ID)
WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_Language=e.AD_Language)
WHERE EXISTS (SELECT *
FROM AD_Table t INNER JOIN AD_Element ex ON (t.TableName||'_ID'=ex.ColumnName)
INNER JOIN AD_Element_Trl e ON (ex.AD_Element_ID=e.AD_Element_ID)
WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_Language=e.AD_Language
AND tt.Name<>e.Name);
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
-- Trl Table Name + Element
UPDATE AD_Table t
SET (Name,Description) = (SELECT e.Name||' Trl', e.Description
FROM AD_Element e
WHERE SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=e.ColumnName)
WHERE TableName LIKE '%_Trl'
AND EXISTS (SELECT * FROM AD_Element e
WHERE SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=e.ColumnName
AND t.Name<>e.Name);
DBMS_OUTPUT.PUT_LINE(' rows updated: ' || SQL%ROWCOUNT);
UPDATE AD_Table_Trl tt
SET Name = (SELECT e.Name || ' **'
FROM AD_Table t INNER JOIN AD_Element ex ON (SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=ex.ColumnName)
INNER JOIN AD_Element_Trl e ON (ex.AD_Element_ID=e.AD_Element_ID)
WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_Language=e.AD_Language)
WHERE EXISTS (SELECT *
FROM AD_Table t INNER JOIN AD_Element ex ON (SUBSTR(t.TableName,1,LENGTH(t.TableName)-4)||'_ID'=ex.ColumnName)
INNER JOIN AD_Element_Trl e ON (ex.AD_Element_ID=e.AD_Element_ID)
WHERE tt.AD_Table_ID=t.AD_Table_ID AND tt.AD_Language=e.AD_Language
AND t.TableName LIKE '%_Trl'
AND tt.Name<>e.Name);
DBMS_OUTPUT.PUT_LINE(' trl rows updated: ' || SQL%ROWCOUNT);
/** Remaining tables
SELECT Name, TableName FROM AD_Table t WHERE Name=TableName ORDER BY 1
**/
<<FINISH_PROCESS>>
IF (p_PInstance_ID IS NOT NULL) THEN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = v_Result, -- 1=success
ErrorMsg = v_Message
WHERE AD_PInstance_ID=p_PInstance_ID;
END IF;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
v_ResultStr := v_ResultStr || ': ' || SQLERRM || ' - ' || v_Message;
DBMS_OUTPUT.PUT_LINE(v_ResultStr);
ROLLBACK;
IF (p_PInstance_ID IS NOT NULL) THEN
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = v_ResultStr
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
END IF;
RETURN;
END AD_Synchronize;
/

View File

@ -0,0 +1,173 @@
CREATE OR REPLACE PROCEDURE C_Order_DrillDown
(
PInstance_ID IN NUMBER
)
/******************************************************************************
* ** Adempiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
* Open Source Software Provided "AS IS" without warranty or liability
* When you use any parts (changed or unchanged), add "Powered by Adempiere" to
* your product name; See license details http://www.adempiere.org/license.html
******************************************************************************
* List Orders with their Shipments and Invoices
* Spool to T_Spool
*/
AS
ResultStr VARCHAR2(2000);
Message VARCHAR2(2000);
Record_ID NUMBER;
CURSOR Cur_Parameter (PInstance NUMBER) IS
SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Parameter
C_Order_ID NUMBER;
--
CURSOR Cur_Order IS
SELECT o.C_Order_ID, d.Name, o.DocumentNo, o.DocStatus, o.DocAction, o.Processed
FROM C_Order o, C_DocType d
WHERE o.C_Order_ID=C_Order_ID
AND o.C_DocType_ID=d.C_DocType_ID
ORDER BY o.DocumentNo DESC;
BEGIN
-- No locking or Updating
-- Get Parameters
ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (PInstance_ID) LOOP
Record_ID := p.Record_ID;
IF (p.ParameterName = 'C_Order_ID') THEN
C_Order_ID := p.P_Number;
DBMS_OUTPUT.PUT_LINE(' C_Order_ID=' || C_Order_ID);
ELSE
DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
END IF;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || Record_ID);
IF (C_Order_ID IS NULL) THEN
C_Order_ID := Record_ID;
END IF;
-- Should be nothing there
DELETE T_Spool
WHERE AD_PInstance_ID=PInstance_ID;
-- Order Info
FOR o IN Cur_Order LOOP
INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
o.Name || ' ' || o.DocumentNo || ': @DocStatus@=' || o.DocStatus
|| ', @DocAction@=' || o.DocAction || ', @Processed@=' || o.Processed);
-- Order Lines
DECLARE
CURSOR Cur_OrderLine IS
SELECT *
FROM C_OrderLine
WHERE C_Order_ID=o.C_Order_ID
ORDER BY Line;
BEGIN
FOR ol IN Cur_OrderLine LOOP
INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
' @QtyOrdered@=' || ol.QtyOrdered || ', @QtyReserved@=' || ol.QtyReserved
|| ', @QtyDelivered@=' || ol.QtyDelivered || ', @QtyInvoiced@=' || ol.QtyInvoiced
|| ' - Wh=' || ol.M_Warehouse_ID
|| ', Prd=' || ol.M_Product_ID);
END LOOP;
END;
-- Shipment
DECLARE
CURSOR Cur_InOut IS
SELECT s.M_InOut_ID, d.Name, s.DocumentNo, s.DocStatus, s.Processed, s.M_Warehouse_ID
FROM M_InOut s, C_DocType d
WHERE s.C_Order_ID = o.C_Order_ID
AND s.C_DocType_ID=d.C_DocType_ID;
BEGIN
FOR s IN Cur_InOut LOOP
INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
'> ' || s.Name || ' ' || s.DocumentNo || ': @DocStatus@=' || s.DocStatus
|| ', @Processed@=' || s.Processed || ', Wh=' || s.M_Warehouse_ID);
-- Shipment Lines
DECLARE
CURSOR Cur_InOutLine IS
SELECT *
FROM M_InOutLine
WHERE M_InOut_ID=s.M_InOut_ID
ORDER BY Line;
BEGIN
FOR sl IN Cur_InOutLine LOOP
INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
' @QtyDelivered@=' || sl.MovementQty || ', Prd=' || sl.M_Product_ID);
END LOOP;
END; -- Shipment Lines
END LOOP; -- Shipments
END; -- Shipment
-- Invoice
DECLARE
CURSOR Cur_Invoice IS
SELECT i.C_Invoice_ID, d.Name, i.DocumentNo, i.DocStatus, i.Processed
FROM C_Invoice i, C_DocType d
WHERE i.C_DocType_ID=d.C_DocType_ID
AND EXISTS (SELECT * FROM C_InvoiceLine l, C_OrderLine ol
WHERE i.C_Invoice_ID = l.C_Invoice_ID
AND l.C_OrderLine_ID = ol.C_OrderLine_ID
AND ol.C_Order_ID=o.C_Order_ID);
BEGIN
FOR i IN Cur_Invoice LOOP
INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
'> ' || i.Name || ' ' || i.DocumentNo || ': @DocStatus@=' || i.DocStatus
|| ', @Processed@=' || i.Processed);
-- Invoice Lines
DECLARE
CURSOR Cur_InvoiceLine IS
SELECT *
FROM C_InvoiceLine
WHERE C_Invoice_ID=i.C_Invoice_ID
ORDER BY Line;
BEGIN
FOR il IN Cur_InvoiceLine LOOP
INSERT INTO T_Spool (AD_PInstance_ID, SeqNo, MsgText) VALUES (PInstance_ID, T_Spool_Seq.NextVal,
' @QtyInvoiced@=' || il.QtyInvoiced || ', Prd=' || il.M_Product_ID);
END LOOP;
END; -- Invoice Lines
END LOOP; -- Invoices
END; -- Invoice
END LOOP; -- Order
<<FINISH_PROCESS>>
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || Message);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 1, -- success
ErrorMsg = Message
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
ResultStr := ResultStr || ': ' || SQLERRM || ' - ' || Message;
DBMS_OUTPUT.PUT_LINE(ResultStr);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = ResultStr
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
RETURN;
END C_Order_DrillDown;
/

View File

@ -0,0 +1,56 @@
IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'C_ProcessCreate')
BEGIN
PRINT '<<< DROPPING PROCEDURE C_ProcessCreate >>>'
DROP Procedure C_ProcessCreate
END
go
------------------------------------------------------------------------------
CREATE Procedure C_ProcessCreate
(
@AD_Table_ID Identifier,
@Record_ID Identifier,
@AD_IProcess_ID Identifier OUTPUT
)
--WITH ENCRYPTION
AS
/******************************************************************************
* Author: Jorg Janke (c) ClassApps 1999
* Version: $Header: /cvs/adempiere/db/database/Procedures/C_ProcessCreate.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
*
* Description:
* Create process for background execution
*
* Return values:
* Int_Process_ID
*
* Called by:
*
******************************************************************************/
BEGIN
Set NoCount ON
BEGIN TRANSACTION
SELECT @AD_IProcess_ID = ISNULL(MAX(AD_IProcess_ID), 0)+1
FROM AD_IProcess
---------------------------------
INSERT INTO AD_IProcess
(AD_IProcess_ID, AD_Table_ID, Record_ID, IsProcessing, Updated)
VALUES
(@AD_IProcess_ID, @AD_Table_ID, @Record_ID, 'N', null)
IF (@@ERROR <> 0)
BEGIN
RAISERROR 60001 'Int_Process insert error'
ROLLBACK TRAN
RETURN(1)
END
COMMIT TRANSACTION
END -- C_ProcessCreate
go
------------------------------------------------------------------------------
IF OBJECT_ID('C_ProcessCreate') IS NOT NULL
PRINT '<<< CREATED PROCEDURE C_ProcessCreate >>>'
ELSE
PRINT '<<< FAILED CREATING PROCEDURE C_ProcessCreate >>>'
go

View File

@ -0,0 +1,21 @@
CREATE OR REPLACE PROCEDURE Cleanup
/******************************************************************************
* ** Adempiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
* Open Source Software Provided "AS IS" without warranty or liability
* When you use any parts (changed or unchanged), add "Powered by Adempiere" to
* your product name; See license details http://www.adempiere.org/license.html
******************************************************************************
* Cleanup old temporary data
*/
AS
BEGIN
-- Processes
DELETE FROM AD_PInstance;
-- Search Info
DELETE FROM AD_Find;
-- Errors older than 1 week
DELETE AD_ERROR WHERE Created < SysDate-7;
--
COMMIT;
END Cleanup;
/

View File

@ -0,0 +1,45 @@
CREATE OR REPLACE PROCEDURE DBA_AfterImport
AS
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: DBA_AfterImport.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
* $Source: /cvs/adempiere/db/database/Procedures/DBA_AfterImport.sql,v $
***
* Title: Run after Import
* Description:
* - Set Java Permissions
* - Recompile
* - Compute Statistics
*****************************************************************************/
-- Statistics
CURSOR Cur_Stat IS
SELECT Table_Name, Blocks
FROM USER_TABLES
WHERE DURATION IS NULL -- No temporary tables
AND Table_Name NOT LIKE '%$%'
AND (LAST_ANALYZED IS NULL OR LAST_ANALYZED < SysDate-7);
--
v_Cmd VARCHAR2(256);
v_NoC NUMBER := 0;
--
BEGIN
-- Recompile
DBA_Recompile(NULL);
-- Statistics
FOR s IN Cur_Stat LOOP
v_Cmd := 'ANALYZE TABLE ' || s.Table_Name || ' COMPUTE STATISTICS';
-- DBMS_OUTPUT.PUT_LINE (v_Cmd);
v_NoC := v_NoC + 1;
EXECUTE IMMEDIATE v_Cmd;
END LOOP;
DBMS_OUTPUT.PUT_LINE ('Statistics computed: ' || v_NoC);
--
END DBA_AfterImport;
/

View File

@ -0,0 +1,117 @@
CREATE OR REPLACE PROCEDURE DBA_Cleanup
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: DBA_Cleanup.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Cleanup old temporary data
* Description:
************************************************************************/
AS
BEGIN
DBMS_OUTPUT.PUT_LINE('DBA_Cleanup');
-- Clean up data
/**
-- C_Invoice_CheckPaid();
UPDATE C_Payment_v
SET IsAllocated=CASE WHEN paymentAllocated(C_Payment_ID, C_Currency_ID)=PayAmt THEN 'Y' ELSE 'N' END
WHERE IsAllocated='N';
UPDATE C_Invoice_v1
SET IsPaid = CASE WHEN invoicePaid(C_Invoice_ID,C_Currency_ID,MultiplierAP)=GrandTotal THEN 'Y' ELSE 'N' END
WHERE IsPaid='N';
**/
-- Temporary Tables
DELETE FROM T_Aging;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_Aging=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_DistributionRunDetail;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_DistributionRunDetail=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_InventoryValue;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_InventoryValue=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_Replenish;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_Replenish=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_Report;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_Report=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_ReportStatement;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_ReportStatement=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_TrialBalance;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_TrialBalance=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_Selection;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_Selection=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_Selection2;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_Selection2=' || SQL%ROWCOUNT);
END IF;
DELETE FROM T_Spool;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' T_Spool=' || SQL%ROWCOUNT);
END IF;
-- Search Info
DELETE FROM AD_Find;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' AD_Find=' || SQL%ROWCOUNT);
END IF;
-- Processes older than a week
DELETE FROM AD_PInstance WHERE Created < SysDate-7;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' Old AD_PInstance=' || SQL%ROWCOUNT);
END IF;
/** Old Session (1 Week)
DELETE FROM AD_ChangeLog WHERE Created < SysDate-7;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' Old AD_ChangeLock=' || SQL%ROWCOUNT);
END IF;
DELETE FROM AD_Session WHERE Created < SysDate-7;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' Old AD_Session=' || SQL%ROWCOUNT);
END IF;
/** */
-- Errors older than 1 week
DELETE FROM AD_Error WHERE Created < SysDate-7;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' Old AD_Error=' || SQL%ROWCOUNT);
END IF;
-- Acknowledged Notes older than a day
DELETE FROM AD_Note WHERE Processed='Y' AND Updated < SysDate-1;
IF (SQL%ROWCOUNT <> 0) THEN
DBMS_OUTPUT.PUT_LINE(' Processed AD_Note=' || SQL%ROWCOUNT);
END IF;
--
COMMIT;
END DBA_Cleanup;
/

View File

@ -0,0 +1,148 @@
CREATE OR REPLACE PROCEDURE DBA_Recompile
(
p_PInstance_ID IN NUMBER -- DEFAULT NULL
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: DBA_Recompile.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Recompile all User_Objects
* Description:
************************************************************************/
AS
-- Logistice
v_Message VARCHAR2(2000) := ' ';
v_Result NUMBER := 1; -- 0=failure
--
v_Buffer VARCHAR2(2000);
v_Line VARCHAR(100);
v_PrintInfo CHAR(1) := 'N'; -- Diagnostic
--
CURSOR Cur_Invalids IS
SELECT object_id, object_name, object_type
FROM user_objects
WHERE status <> 'VALID'
AND object_type IN ('VIEW', 'PACKAGE', 'PACKAGE BODY', 'FUNCTION',
'PROCEDURE', 'TRIGGER', 'JAVA CLASS')
ORDER BY object_type, object_name;
CURSOR Cur_Valids (p_id NUMBER) IS
SELECT 'FOUND'
FROM user_objects
WHERE status = 'VALID'
AND object_id = p_id;
-- failed compile
TYPE invalid_tab IS TABLE OF Cur_Invalids%ROWTYPE INDEX BY BINARY_INTEGER;
invalid_tab_rec invalid_tab;
count_compiled PLS_INTEGER;
valid_text VARCHAR2(5);
exec_cursor PLS_INTEGER := DBMS_SQL.OPEN_CURSOR;
sql_statement VARCHAR2(200);
count_object PLS_INTEGER := 0;
BEGIN
LOOP
count_compiled := 0;
FOR ci IN Cur_Invalids LOOP
-- not unsuccessfuly compiled yet
IF NOT invalid_tab_rec.EXISTS(ci.object_id) THEN
IF (ci.object_type = 'JAVA CLASS') THEN
sql_statement := 'ALTER JAVA CLASS "' || ci.object_name || '" RESOLVE';
ELSIF (ci.object_type = 'PACKAGE BODY') THEN
sql_statement := 'ALTER PACKAGE ' || ci.object_name || ' COMPILE BODY';
ELSE
sql_statement := 'ALTER ' || ci.object_type || ' ' || ci.object_name || ' COMPILE';
END IF;
-- compile
BEGIN
count_object := count_object + 1;
DBMS_SQL.PARSE(exec_cursor, sql_statement, DBMS_SQL.NATIVE);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
--
OPEN Cur_Valids (ci.object_ID);
FETCH Cur_Valids INTO valid_text;
IF Cur_Valids%ROWCOUNT > 0 THEN
IF (v_PrintInfo = 'Y') THEN
DBMS_OUTPUT.PUT_LINE('OK: ' || ci.object_type || ' ' || ci.object_name);
END IF;
count_compiled := count_compiled + 1;
CLOSE Cur_Valids;
EXIT;
ELSE
IF (LENGTH(v_Message) < 1950) THEN
v_Message := v_Message || ci.object_name || ' ';
END IF;
IF (v_PrintInfo = 'Y') THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || ci.object_type || ' ' || ci.object_name);
END IF;
--
invalid_tab_rec(ci.object_id).object_name := ci.object_name;
invalid_tab_rec(ci.object_id).object_type := ci.object_type;
CLOSE Cur_Valids;
END IF;
END IF; -- not unsuccessfuly compiled yet
END LOOP; -- Cur_Invalids
-- any other to be compiled
IF count_compiled = 0 THEN
EXIT;
END IF;
END LOOP; -- outer loop
DBMS_SQL.CLOSE_CURSOR(exec_cursor);
--
-- Print Message
IF (LENGTH(v_Message) = 1) THEN
v_Message := 'All valid';
DBMS_OUTPUT.PUT_LINE(v_Message);
ELSIF (LENGTH(v_Message) > 80) THEN
v_Buffer := v_Message;
DBMS_OUTPUT.PUT_LINE('>');
WHILE (LENGTH(v_Buffer) > 0) LOOP
v_Line := SUBSTR(v_Buffer, 1, 80);
DBMS_OUTPUT.PUT_LINE(v_Line);
v_Buffer := SUBSTR(v_Buffer, 81);
END LOOP;
DBMS_OUTPUT.PUT_LINE('<');
v_Result := 0;
DBMS_OUTPUT.PUT_LINE('ERROR');
ELSE
DBMS_OUTPUT.PUT_LINE('>' || v_Message || '<');
v_Result := 0;
DBMS_OUTPUT.PUT_LINE('ERROR');
END IF;
<<FINISH_PROCESS>>
IF (p_PInstance_ID IS NOT NULL) THEN
-- Update AD_PInstance
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = v_Result, -- 1=success
ErrorMsg = v_Message
WHERE AD_PInstance_ID=p_PInstance_ID;
END IF;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
IF DBMS_SQL.IS_OPEN(exec_cursor) THEN
DBMS_SQL.CLOSE_CURSOR(exec_cursor);
END IF;
IF Cur_Valids%ISOPEN THEN
CLOSE Cur_Valids;
END IF;
END DBA_Recompile;
/

View File

@ -0,0 +1,116 @@
CREATE OR REPLACE PROCEDURE Fact_Acct_Balance_Update
(
p_DeleteFirst IN VARCHAR2 DEFAULT 'N'
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2003 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: Fact_Acct_Balance_Update.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Update ALL Balances
* Description:
* - Recreates all Balances
************************************************************************/
AS
BEGIN
IF (p_DeleteFirst = 'Y') THEN
DELETE Fact_Acct_Balance;
DBMS_OUTPUT.PUT_LINE(' Deletes=' || SQL%ROWCOUNT);
ELSE
/** Update **/
UPDATE Fact_Acct_Balance ab
SET (AmtAcctDr, AmtAcctCr, Qty) =
(SELECT COALESCE(SUM(AmtAcctDr),0), COALESCE(SUM(AmtAcctCr),0), COALESCE(SUM(Qty),0)
FROM Fact_Acct a
WHERE a.AD_Client_ID=ab.AD_Client_ID AND a.AD_Org_ID=ab.AD_Org_ID
AND a.C_AcctSchema_ID=ab.C_AcctSchema_ID AND TRUNC(a.DateAcct)=TRUNC(ab.DateAcct)
AND a.Account_ID=ab.Account_ID AND a.PostingType=ab.PostingType
AND COALESCE(a.M_Product_ID,0)=COALESCE(ab.M_Product_ID,0) AND COALESCE(a.C_BPartner_ID,0)=COALESCE(ab.C_BPartner_ID,0)
AND COALESCE(a.C_Project_ID,0)=COALESCE(ab.C_Project_ID,0) AND COALESCE(a.AD_OrgTrx_ID,0)=COALESCE(ab.AD_OrgTrx_ID,0)
AND COALESCE(a.C_SalesRegion_ID,0)=COALESCE(ab.C_SalesRegion_ID,0) AND COALESCE(a.C_Activity_ID,0)=COALESCE(ab.C_Activity_ID,0)
AND COALESCE(a.C_Campaign_ID,0)=COALESCE(ab.C_Campaign_ID,0) AND COALESCE(a.C_LocTo_ID,0)=COALESCE(ab.C_LocTo_ID,0) AND COALESCE(a.C_LocFrom_ID,0)=COALESCE(ab.C_LocFrom_ID,0)
AND COALESCE(a.User1_ID,0)=COALESCE(ab.User1_ID,0) AND COALESCE(a.User2_ID,0)=COALESCE(ab.User2_ID,0) AND COALESCE(a.GL_Budget_ID,0)=COALESCE(ab.GL_Budget_ID,0)
GROUP BY AD_Client_ID,AD_Org_ID,
C_AcctSchema_ID, TRUNC(DateAcct),
Account_ID, PostingType,
M_Product_ID, C_BPartner_ID,
C_Project_ID, AD_OrgTrx_ID,
C_SalesRegion_ID, C_Activity_ID,
C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
User1_ID, User2_ID, GL_Budget_ID)
WHERE EXISTS
(SELECT *
FROM Fact_Acct a
WHERE a.AD_Client_ID=ab.AD_Client_ID AND a.AD_Org_ID=ab.AD_Org_ID
AND a.C_AcctSchema_ID=ab.C_AcctSchema_ID AND TRUNC(a.DateAcct)=TRUNC(ab.DateAcct)
AND a.Account_ID=ab.Account_ID AND a.PostingType=ab.PostingType
AND COALESCE(a.M_Product_ID,0)=COALESCE(ab.M_Product_ID,0) AND COALESCE(a.C_BPartner_ID,0)=COALESCE(ab.C_BPartner_ID,0)
AND COALESCE(a.C_Project_ID,0)=COALESCE(ab.C_Project_ID,0) AND COALESCE(a.AD_OrgTrx_ID,0)=COALESCE(ab.AD_OrgTrx_ID,0)
AND COALESCE(a.C_SalesRegion_ID,0)=COALESCE(ab.C_SalesRegion_ID,0) AND COALESCE(a.C_Activity_ID,0)=COALESCE(ab.C_Activity_ID,0)
AND COALESCE(a.C_Campaign_ID,0)=COALESCE(ab.C_Campaign_ID,0) AND COALESCE(a.C_LocTo_ID,0)=COALESCE(ab.C_LocTo_ID,0) AND COALESCE(a.C_LocFrom_ID,0)=COALESCE(ab.C_LocFrom_ID,0)
AND COALESCE(a.User1_ID,0)=COALESCE(ab.User1_ID,0) AND COALESCE(a.User2_ID,0)=COALESCE(ab.User2_ID,0) AND COALESCE(a.GL_Budget_ID,0)=COALESCE(ab.GL_Budget_ID,0)
GROUP BY AD_Client_ID,AD_Org_ID,
C_AcctSchema_ID, TRUNC(DateAcct),
Account_ID, PostingType,
M_Product_ID, C_BPartner_ID,
C_Project_ID, AD_OrgTrx_ID,
C_SalesRegion_ID, C_Activity_ID,
C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
User1_ID, User2_ID, GL_Budget_ID);
DBMS_OUTPUT.PUT_LINE(' Updates=' || SQL%ROWCOUNT);
END IF;
/** Insert **/
INSERT INTO Fact_Acct_Balance ab
(AD_Client_ID, AD_Org_ID,
C_AcctSchema_ID, DateAcct,
Account_ID, PostingType,
M_Product_ID, C_BPartner_ID,
C_Project_ID, AD_OrgTrx_ID,
C_SalesRegion_ID,C_Activity_ID,
C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
User1_ID, User2_ID, GL_Budget_ID,
AmtAcctDr, AmtAcctCr, Qty)
--
SELECT AD_Client_ID, AD_Org_ID,
C_AcctSchema_ID, TRUNC(DateAcct),
Account_ID, PostingType,
M_Product_ID, C_BPartner_ID,
C_Project_ID, AD_OrgTrx_ID,
C_SalesRegion_ID,C_Activity_ID,
C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
User1_ID, User2_ID, GL_Budget_ID,
COALESCE(SUM(AmtAcctDr),0), COALESCE(SUM(AmtAcctCr),0), COALESCE(SUM(Qty),0)
FROM Fact_Acct a
WHERE NOT EXISTS
(SELECT *
FROM Fact_Acct_Balance x
WHERE a.AD_Client_ID=x.AD_Client_ID AND a.AD_Org_ID=x.AD_Org_ID
AND a.C_AcctSchema_ID=x.C_AcctSchema_ID AND TRUNC(a.DateAcct)=TRUNC(x.DateAcct)
AND a.Account_ID=x.Account_ID AND a.PostingType=x.PostingType
AND COALESCE(a.M_Product_ID,0)=COALESCE(x.M_Product_ID,0) AND COALESCE(a.C_BPartner_ID,0)=COALESCE(x.C_BPartner_ID,0)
AND COALESCE(a.C_Project_ID,0)=COALESCE(x.C_Project_ID,0) AND COALESCE(a.AD_OrgTrx_ID,0)=COALESCE(x.AD_OrgTrx_ID,0)
AND COALESCE(a.C_SalesRegion_ID,0)=COALESCE(x.C_SalesRegion_ID,0) AND COALESCE(a.C_Activity_ID,0)=COALESCE(x.C_Activity_ID,0)
AND COALESCE(a.C_Campaign_ID,0)=COALESCE(x.C_Campaign_ID,0) AND COALESCE(a.C_LocTo_ID,0)=COALESCE(x.C_LocTo_ID,0) AND COALESCE(a.C_LocFrom_ID,0)=COALESCE(x.C_LocFrom_ID,0)
AND COALESCE(a.User1_ID,0)=COALESCE(x.User1_ID,0) AND COALESCE(a.User2_ID,0)=COALESCE(x.User2_ID,0) AND COALESCE(a.GL_Budget_ID,0)=COALESCE(x.GL_Budget_ID,0) )
GROUP BY AD_Client_ID,AD_Org_ID,
C_AcctSchema_ID, TRUNC(DateAcct),
Account_ID, PostingType,
M_Product_ID, C_BPartner_ID,
C_Project_ID, AD_OrgTrx_ID,
C_SalesRegion_ID, C_Activity_ID,
C_Campaign_ID, C_LocTo_ID, C_LocFrom_ID,
User1_ID, User2_ID, GL_Budget_ID;
DBMS_OUTPUT.PUT_LINE(' Inserts=' || SQL%ROWCOUNT);
-----------------------
COMMIT;
END Fact_Acct_Balance_Update;
/

View File

@ -0,0 +1,374 @@
CREATE OR REPLACE PROCEDURE M_PriceList_Create
(
PInstance_ID IN NUMBER
)
AS
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2003 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: M_PriceList_Create.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Create Pricelist
* Description:
* Create PriceList by copying purchase prices (M_Product_PO)
* and applying product category discounts (M_CategoryDiscount)
************************************************************************/
-- Logistice
ResultStr VARCHAR2(2000);
Message VARCHAR2(2000) := '';
NoRate EXCEPTION;
-- Parameter
CURSOR Cur_Parameter (PInstance NUMBER) IS
SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Parameter Variables
p_PriceList_Version_ID NUMBER;
p_DeleteOld CHAR(1) := 'N';
--
v_Currency_ID NUMBER;
v_Client_ID NUMBER;
v_Org_ID NUMBER;
v_UpdatedBy NUMBER;
v_StdPrecision NUMBER;
v_DiscountSchema_ID NUMBER;
v_PriceList_Version_Base_ID NUMBER;
--
v_NextNo NUMBER := 0;
-- Get PL Parameter
CURSOR Cur_DiscountLine (DiscountSchema_ID NUMBER) IS
SELECT *
FROM M_DiscountSchemaLine
WHERE M_DiscountSchema_ID=DiscountSchema_ID
AND IsActive='Y'
ORDER BY SeqNo;
BEGIN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing');
ResultStr := 'PInstanceNotFound';
UPDATE AD_PInstance
SET Created = SysDate,
IsProcessing = 'Y'
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
-- Get Parameters
ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (PInstance_ID) LOOP
p_PriceList_Version_ID := p.Record_ID;
IF (p.ParameterName = 'DeleteOld') THEN
p_DeleteOld := p.P_String;
DBMS_OUTPUT.PUT_LINE(' DeleteOld=' || p_DeleteOld);
ELSE
DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
END IF;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' PriceList_Version_ID=' || p_PriceList_Version_ID);
-- Checking Prerequisites
-- -- PO Prices must exists
ResultStr := 'CorrectingProductPO';
DBMS_OUTPUT.PUT_LINE(ResultStr);
UPDATE M_Product_PO
SET PriceList = 0
WHERE PriceList IS NULL;
UPDATE M_Product_PO
SET PriceLastPO = 0
WHERE PriceLastPO IS NULL;
UPDATE M_Product_PO
SET PricePO = PriceLastPO
WHERE (PricePO IS NULL OR PricePO = 0) AND PriceLastPO <> 0;
UPDATE M_Product_PO
SET PricePO = 0
WHERE PricePO IS NULL;
-- Set default current vendor
UPDATE M_Product_PO p
SET IsCurrentVendor = 'Y'
WHERE IsCurrentVendor = 'N'
AND NOT EXISTS
(SELECT pp.M_Product_ID FROM M_Product_PO pp
WHERE pp.M_Product_ID=p.M_Product_ID
GROUP BY pp.M_Product_ID HAVING COUNT(*) > 1);
COMMIT;
/**
* Make sure that we have only one active product
*/
ResultStr := 'CorrectingDuplicates';
DBMS_OUTPUT.PUT_LINE(ResultStr);
DECLARE
-- All duplicate products
CURSOR Cur_Duplicates IS
SELECT DISTINCT M_Product_ID
FROM M_Product_PO po
WHERE IsCurrentVendor='Y' AND IsActive='Y'
AND EXISTS ( SELECT M_Product_ID FROM M_Product_PO x
WHERE x.M_Product_ID=po.M_Product_ID
GROUP BY M_Product_ID HAVING COUNT(*) > 1 )
ORDER BY 1;
-- All vendors of Product - expensive first
CURSOR Cur_Vendors (Product_ID NUMBER) IS
SELECT M_Product_ID, C_BPartner_ID
FROM M_Product_PO
WHERE IsCurrentVendor='Y' AND IsActive='Y'
AND M_Product_ID=Product_ID
ORDER BY PriceList DESC;
--
Product_ID NUMBER;
BPartner_ID NUMBER;
BEGIN
FOR dupl IN Cur_Duplicates LOOP
OPEN Cur_Vendors (dupl.M_Product_ID);
FETCH Cur_Vendors INTO Product_ID, BPartner_ID; -- Leave First
LOOP
FETCH Cur_Vendors INTO Product_ID, BPartner_ID; -- Get Record ID
EXIT WHEN Cur_Vendors%NOTFOUND;
--
DBMS_OUTPUT.PUT_LINE(' Record: ' || Product_ID || ' / ' || BPartner_ID);
UPDATE M_Product_PO
SET IsCurrentVendor='N'
WHERE M_Product_ID=Product_ID AND C_BPartner_ID=BPartner_ID;
END LOOP;
CLOSE Cur_Vendors;
END LOOP;
COMMIT;
END;
/** Delete Old Data */
ResultStr := 'DeletingOld';
IF (p_DeleteOld = 'Y') THEN
DELETE M_ProductPrice
WHERE M_PriceList_Version_ID = p_PriceList_Version_ID;
Message := '@Deleted@=' || SQL%ROWCOUNT || ' - ';
DBMS_OUTPUT.PUT_LINE(Message);
END IF;
-- Get PriceList Info
ResultStr := 'GetPLInfo';
DBMS_OUTPUT.PUT_LINE(ResultStr);
SELECT p.C_Currency_ID, c.StdPrecision,
v.AD_Client_ID, v.AD_Org_ID, v.UpdatedBy,
v.M_DiscountSchema_ID, M_PriceList_Version_Base_ID
INTO v_Currency_ID, v_StdPrecision,
v_Client_ID, v_Org_ID, v_UpdatedBy,
v_DiscountSchema_ID, v_PriceList_Version_Base_ID
FROM M_PriceList p, M_PriceList_Version v, C_Currency c
WHERE p.M_PriceList_ID=v.M_PriceList_ID
AND p.C_Currency_ID=c.C_Currency_ID
AND v.M_PriceList_Version_ID=p_PriceList_Version_ID;
/**
* For All Discount Lines in Sequence
*/
FOR dl IN Cur_DiscountLine (v_DiscountSchema_ID) LOOP
ResultStr := 'Parameter Seq=' || dl.SeqNo;
-- DBMS_OUTPUT.PUT_LINE(ResultStr);
-- Clear Temporary Table
DELETE FROM T_Selection;
-- -----------------------------------
-- Create Selection in temporary table
-- -----------------------------------
IF (v_PriceList_Version_Base_ID IS NULL) THEN
-- Create Selection from M_Product_PO
INSERT INTO T_Selection (T_Selection_ID)
SELECT DISTINCT po.M_Product_ID
FROM M_Product p, M_Product_PO po
WHERE p.M_Product_ID=po.M_Product_ID
AND (p.AD_Client_ID=v_Client_ID OR p.AD_Client_ID=0)
AND p.IsActive='Y' AND po.IsActive='Y' AND po.IsCurrentVendor='Y'
-- Optional Restrictions
AND (dl.M_Product_Category_ID IS NULL OR p.M_Product_Category_ID=dl.M_Product_Category_ID)
AND (dl.C_BPartner_ID IS NULL OR po.C_BPartner_ID=dl.C_BPartner_ID)
AND (dl.M_Product_ID IS NULL OR p.M_Product_ID=dl.M_Product_ID);
ELSE
-- Create Selection from existing PriceList
INSERT INTO T_Selection (T_Selection_ID)
SELECT DISTINCT p.M_Product_ID
FROM M_Product p, M_ProductPrice pp
WHERE p.M_Product_ID=pp.M_Product_ID
AND pp.M_PriceList_Version_ID=v_PriceList_Version_Base_ID
AND p.IsActive='Y' AND pp.IsActive='Y'
-- Optional Restrictions
AND (dl.M_Product_Category_ID IS NULL OR p.M_Product_Category_ID=dl.M_Product_Category_ID)
AND (dl.C_BPartner_ID IS NULL OR EXISTS
(SELECT * FROM M_Product_PO po WHERE po.M_Product_ID=p.M_Product_ID AND po.C_BPartner_ID=dl.C_BPartner_ID))
AND (dl.M_Product_ID IS NULL OR p.M_Product_ID=dl.M_Product_ID);
END IF;
Message := Message || '@Selected@=' || SQL%ROWCOUNT;
-- DBMS_OUTPUT.PUT_LINE(Message);
-- Delete Prices in Selection, so that we can insert
IF (v_PriceList_Version_Base_ID IS NULL
OR v_PriceList_Version_Base_ID <> p_PriceList_Version_ID) THEN
ResultStr := ResultStr || ', Delete';
DELETE M_ProductPrice pp
WHERE pp.M_PriceList_Version_ID = p_PriceList_Version_ID
AND EXISTS (SELECT * FROM T_Selection s WHERE pp.M_Product_ID=s.T_Selection_ID);
Message := ', @Deleted@=' || SQL%ROWCOUNT;
END IF;
-- --------------------
-- Copy (Insert) Prices
-- --------------------
IF (v_PriceList_Version_Base_ID = p_PriceList_Version_ID) THEN
-- We have Prices already
NULL;
ELSIF (v_PriceList_Version_Base_ID IS NULL) THEN
-- Copy and Convert from Product_PO
ResultStr := ResultStr || ',Copy_PO';
INSERT INTO M_ProductPrice
(M_PriceList_Version_ID, M_Product_ID,
AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
PriceList, PriceStd, PriceLimit)
SELECT
p_PriceList_Version_ID, po.M_Product_ID,
v_Client_ID, v_Org_ID, 'Y', SysDate, v_UpdatedBy, SysDate, v_UpdatedBy,
-- Price List
COALESCE(currencyConvert(po.PriceList,
po.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0),
-- Price Std
COALESCE(currencyConvert(po.PriceList,
po.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0),
-- Price Limit
COALESCE(currencyConvert(po.PricePO,
po.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0)
FROM M_Product_PO po
WHERE EXISTS (SELECT * FROM T_Selection s WHERE po.M_Product_ID=s.T_Selection_ID)
AND po.IsCurrentVendor='Y' AND po.IsActive='Y';
ELSE
-- Copy and Convert from other PriceList_Version
ResultStr := ResultStr || ',Copy_PL';
INSERT INTO M_ProductPrice
(M_PriceList_Version_ID, M_Product_ID,
AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
PriceList, PriceStd, PriceLimit)
SELECT
p_PriceList_Version_ID, pp.M_Product_ID,
v_Client_ID, v_Org_ID, 'Y', SysDate, v_UpdatedBy, SysDate, v_UpdatedBy,
-- Price List
COALESCE(currencyConvert(pp.PriceList,
pl.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0),
-- Price Std
COALESCE(currencyConvert(pp.PriceStd,
pl.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0),
-- Price Limit
COALESCE(currencyConvert(pp.PriceLimit,
pl.C_Currency_ID, v_Currency_ID, dl.ConversionDate, dl.C_ConversionType_ID, v_Client_ID, v_Org_ID),0)
FROM M_ProductPrice pp
INNER JOIN M_PriceList_Version plv ON (pp.M_PriceList_Version_ID=plv.M_PriceList_Version_ID)
INNER JOIN M_PriceList pl ON (plv.M_PriceList_ID=pl.M_PriceList_ID)
WHERE pp.M_PriceList_Version_ID=v_PriceList_Version_Base_ID
AND EXISTS (SELECT * FROM T_Selection s WHERE pp.M_Product_ID=s.T_Selection_ID)
AND pp.IsActive='Y';
END IF;
Message := Message || ', @Inserted@=' || SQL%ROWCOUNT;
-- -----------
-- Calculation
-- -----------
ResultStr := ResultStr || ',Calc';
UPDATE M_ProductPrice p
SET PriceList = (DECODE(dl.List_Base, 'S', PriceStd, 'X', PriceLimit, PriceList)
+ dl.List_AddAmt) * (1 - dl.List_Discount/100),
PriceStd = (DECODE(dl.Std_Base, 'L', PriceList, 'X', PriceLimit, PriceStd)
+ dl.Std_AddAmt) * (1 - dl.Std_Discount/100),
PriceLimit = (DECODE(dl.Limit_Base, 'L', PriceList, 'S', PriceStd, PriceLimit)
+ dl.Limit_AddAmt) * (1 - dl.Limit_Discount/100)
WHERE M_PriceList_Version_ID=p_PriceList_Version_ID
AND EXISTS (SELECT * FROM T_Selection s
WHERE s.T_Selection_ID=p.M_Product_ID);
-- --------
-- Rounding (AD_Reference_ID=155)
-- --------
ResultStr := ResultStr || ',Round';
UPDATE M_ProductPrice p
SET PriceList = DECODE(dl.List_Rounding,
'N', PriceList,
'0', ROUND(PriceList, 0), -- Even .00
'D', ROUND(PriceList, 1), -- Dime .10
'T', ROUND(PriceList, -1), -- Ten 10.00
'5', ROUND(PriceList*20,0)/20, -- Nickle .05
'Q', ROUND(PriceList*4,0)/4, -- Quarter .25
ROUND(PriceList, v_StdPrecision)),-- Currency
PriceStd = DECODE(dl.Std_Rounding,
'N', PriceStd,
'0', ROUND(PriceStd, 0), -- Even .00
'D', ROUND(PriceStd, 1), -- Dime .10
'T', ROUND(PriceStd, -1), -- Ten 10.00
'5', ROUND(PriceStd*20,0)/20, -- Nickle .05
'Q', ROUND(PriceStd*4,0)/4, -- Quarter .25
ROUND(PriceStd, v_StdPrecision)), -- Currency
PriceLimit = DECODE(dl.Limit_Rounding,
'N', PriceLimit,
'0', ROUND(PriceLimit, 0), -- Even .00
'D', ROUND(PriceLimit, 1), -- Dime .10
'T', ROUND(PriceLimit, -1), -- Ten 10.00
'5', ROUND(PriceLimit*20,0)/20, -- Nickle .05
'Q', ROUND(PriceLimit*4,0)/4, -- Quarter .25
ROUND(PriceLimit, v_StdPrecision))-- Currency
WHERE M_PriceList_Version_ID=p_PriceList_Version_ID
AND EXISTS (SELECT * FROM T_Selection s
WHERE s.T_Selection_ID=p.M_Product_ID);
Message := Message || ', @Updated@=' || SQL%ROWCOUNT;
-- Fixed Price overwrite
ResultStr := ResultStr || ',Fix';
UPDATE M_ProductPrice p
SET PriceList = DECODE(dl.List_Base, 'F', dl.List_Fixed, PriceList),
PriceStd = DECODE(dl.Std_Base, 'F', dl.Std_Fixed, PriceStd),
PriceLimit = DECODE(dl.Limit_Base, 'F', dl.Limit_Fixed, PriceLimit)
WHERE M_PriceList_Version_ID=p_PriceList_Version_ID
AND EXISTS (SELECT * FROM T_Selection s
WHERE s.T_Selection_ID=p.M_Product_ID);
-- Log Info
INSERT INTO AD_PInstance_Log (AD_PInstance_ID, Log_ID, P_ID, P_NUMBER, P_MSG)
VALUES (PInstance_ID, v_NextNo, null, dl.SeqNo, Message);
--
v_NextNo := v_NextNo + 1;
Message := '';
END LOOP; -- For all DiscountLines
-- Delete Temporary Selection
DELETE FROM T_Selection;
<<FINISH_PROCESS>>
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE(Message);
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished');
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 1, -- success
ErrorMsg = Message
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
ResultStr := ResultStr || ':' || SQLERRM || ' ' || Message;
DBMS_OUTPUT.PUT_LINE(ResultStr);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = ResultStr
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
RETURN;
END M_PriceList_Create;
/

View File

@ -0,0 +1,147 @@
CREATE OR REPLACE PROCEDURE M_Product_BOM_Check
(
PInstance_ID IN NUMBER
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: M_Product_BOM_Check.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Check BOM Structure (free of cycles)
* Description:
* Tree cannot contain BOMs which are already referenced
************************************************************************/
AS
-- Logistice
ResultStr VARCHAR2(2000);
Message VARCHAR2(2000);
Record_ID NUMBER;
-- Parameter
CURSOR Cur_Parameter (PInstance NUMBER) IS
SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Variables
Verified CHAR(1) := 'Y';
IsBOM CHAR(1);
CountNo NUMBER;
BEGIN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || PInstance_ID);
ResultStr := 'PInstanceNotFound';
UPDATE AD_PInstance
SET Created = SysDate,
IsProcessing = 'Y'
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
-- Get Parameters
ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (PInstance_ID) LOOP
Record_ID := p.Record_ID;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || Record_ID);
-- Record ID is M_Product_ID of product to be tested
SELECT IsBOM
INTO IsBOM
FROM M_Product
WHERE M_Product_ID=Record_ID;
-- No BOM - should not happen, but no problem
IF (IsBOM = 'N') THEN
GOTO FINISH_PROCESS;
-- Did not find product
ELSIF (IsBOM <> 'Y') THEN
RETURN;
END IF;
-- Checking BOM Structure
ResultStr := 'InsertingRoot';
-- Table to put all BOMs - duplicate will cause exception
DELETE FROM T_Selection2 WHERE Query_ID = 0;
INSERT INTO T_Selection2 (Query_ID, T_Selection_ID) VALUES (0, Record_ID);
-- Table of root modes
DELETE FROM T_Selection;
INSERT INTO T_Selection (T_Selection_ID) VALUES (Record_ID);
LOOP
-- How many do we have?
SELECT COUNT(*)
INTO CountNo
FROM T_Selection;
-- Nothing to do
EXIT WHEN (CountNo = 0);
-- Insert BOM Nodes into "All" table
INSERT INTO T_Selection2 (Query_ID, T_Selection_ID)
SELECT 0, p.M_Product_ID
FROM M_Product p
WHERE IsBOM='Y'
AND EXISTS (SELECT * FROM M_Product_BOM b WHERE p.M_Product_ID=b.M_ProductBOM_ID
AND b.M_Product_ID IN (SELECT T_Selection_ID FROM T_Selection));
-- Insert BOM Nodes into temporary table
DELETE FROM T_Selection2 WHERE Query_ID = 1;
INSERT INTO T_Selection2 (Query_ID, T_Selection_ID)
SELECT 1, p.M_Product_ID
FROM M_Product p
WHERE IsBOM='Y'
AND EXISTS (SELECT * FROM M_Product_BOM b WHERE p.M_Product_ID=b.M_ProductBOM_ID
AND b.M_Product_ID IN (SELECT T_Selection_ID FROM T_Selection));
-- Copy into root table
DELETE FROM T_Selection;
INSERT INTO T_Selection (T_Selection_ID)
SELECT T_Selection_ID
FROM T_Selection2
WHERE Query_ID = 1;
END LOOP;
<<FINISH_PROCESS>>
-- OK
Message := 'OK';
UPDATE M_Product
SET IsVerified = 'Y'
WHERE M_Product_ID=Record_ID;
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || Message);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 1, -- success
ErrorMsg = Message
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
ResultStr := ResultStr || ': ' || SQLERRM || ' - ' || Message;
DBMS_OUTPUT.PUT_LINE(ResultStr);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = ResultStr
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
--
UPDATE M_Product
SET IsVerified = 'N'
WHERE M_Product_ID=Record_ID;
COMMIT;
--
RETURN;
END M_Product_BOM_Check;
/

View File

@ -0,0 +1,37 @@
CREATE OR REPLACE PROCEDURE M_Product_Delete
(
whereClause IN VARCHAR2 DEFAULT NULL
)
AS
/******************************************************************************
* ** Adempiere Product ** Copyright (c) 1999-2001 Accorto, Inc. USA
* Open Source Software Provided "AS IS" without warranty or liability
* When you use any parts (changed or unchanged), add "Powered by Adempiere" to
* your product name; See license details http://www.adempiere.org/license.html
******************************************************************************
* Delete Products
*/
CURSOR CUR_DEL IS
SELECT M_Product_ID, Value, Name
FROM M_Product
WHERE IsActive='N';
--
SQL_Base VARCHAR2(255) := 'SELECT M_Product_ID FROM M_Product WHERE ';
-- SQL_Where VARCHAR2(255) := 'ValueX IN (SELECT ValueX FROM M_Product GROUP BY ValueX HAVING Count(*) <> 1) AND INSTR(Value,''@'') <> 0';
SQL_Statement VARCHAR2(255);
BEGIN
-- Delete inactive
IF (whereClause IS NULL OR LENGTH(whereClause) = 0) THEN
For d IN CUR_DEL LOOP
BEGIN
DBMS_OUTPUT.PUT('Deleting ' || d.Name || ' - ');
DELETE M_Product
WHERE M_Product_ID=d.M_Product_ID;
DBMS_OUTPUT.PUT_LINE('OK');
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error ' || SQLERRM);
END;
END LOOP;
END IF;
END M_Product_Delete;
/

View File

@ -0,0 +1,298 @@
CREATE OR REPLACE PROCEDURE M_Production_Run
(
PInstance_ID IN NUMBER
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: M_Production_Run.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Production of BOMs
* Description:
* 1) Creating ProductionLines when IsCreated = 'N'
* 2) Posting the Lines (optionally only when fully stocked)
************************************************************************/
AS
-- Logistice
ResultStr VARCHAR2(2000);
Message VARCHAR2(2000);
Record_ID NUMBER;
-- Parameter
CURSOR Cur_Parameter (PInstance NUMBER) IS
SELECT i.Record_ID, p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Parameter Variables
MustBeStocked CHAR(1);
IsCreated CHAR(1);
Processed CHAR(1);
Client_ID NUMBER;
Org_ID NUMBER;
--
Line NUMBER;
NextNo NUMBER;
CountNo NUMBER;
-- ProductionPlan
CURSOR CUR_PP IS
SELECT *
FROM M_ProductionPlan
WHERE M_Production_ID=Record_ID
ORDER BY Line, M_Product_ID;
-- BOM Lines
CURSOR CUR_BOM (Product_ID NUMBER) IS
SELECT *
FROM M_Product_BOM
WHERE M_Product_ID=Product_ID
ORDER BY Line;
-- ProductionLines which are non-stocked BOMs (need to be resolved)
CURSOR CUR_PLineBOM (ProductionPlan_ID NUMBER) IS
SELECT pl.M_ProductionLine_ID, pl.Line, pl.M_Product_ID, pl.MovementQty
FROM M_ProductionLine pl, M_Product p
WHERE pl.M_ProductionPlan_ID=ProductionPlan_ID
AND pl.M_Product_ID=p.M_Product_ID
AND pl.Line<>100 -- Origin Line
AND p.IsBOM='Y' AND p.IsStocked='N';
-- Posting
CURSOR CUR_PL_Post IS
SELECT pl.M_ProductionLine_ID, pl.AD_Client_ID, pl.AD_Org_ID, p.MovementDate,
pl.M_Product_ID, pl.M_AttributeSetInstance_ID, pl.MovementQty, pl.M_Locator_ID
FROM M_Production p, M_ProductionLine pl, M_ProductionPlan pp
WHERE p.M_Production_ID=pp.M_Production_ID
AND pp.M_ProductionPlan_ID=pl.M_ProductionPlan_ID
AND pp.M_Production_ID=Record_ID
ORDER BY pp.Line, pl.Line;
BEGIN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || PInstance_ID);
ResultStr := 'PInstanceNotFound';
UPDATE AD_PInstance
SET Created = SysDate,
IsProcessing = 'Y'
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
-- Get Parameters
ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (PInstance_ID) LOOP
Record_ID := p.Record_ID;
IF (p.ParameterName = 'MustBeStocked') THEN
MustBeStocked := p.P_String;
DBMS_OUTPUT.PUT_LINE(' MustBeStocked=' || MustBeStocked);
ELSE
DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
END IF;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || Record_ID);
-- Processing??? Lock ????
-- TODO
/**
* Get Info + Lock
*/
ResultStr := 'ReadingRecord';
SELECT IsCreated, Processed, AD_Client_ID, AD_Org_ID
INTO IsCreated, Processed, Client_ID, Org_ID
FROM M_Production
WHERE M_Production_ID=Record_ID
FOR UPDATE;
/**
* No Action
*/
IF (Processed <> 'N') THEN
Message := '@AlreadyPosted@';
GOTO FINISH_PROCESS;
END IF;
/**************************************************************************
* Create Lines
*/
IF (IsCreated <> 'Y') THEN
-- For every Production Plan
FOR pp IN CUR_PP LOOP
-- Delete prior lines
DELETE M_ProductionLine
WHERE M_ProductionPlan_ID=pp.M_ProductionPlan_ID;
-- DBMS_OUTPUT.PUT_LINE('ProductionPlan=' || pp.M_ProductionPlan_ID);
-- Create BOM Line
ResultStr := 'CreatingLine BOM';
Line := 100; -- OriginLine
AD_Sequence_Next('M_ProductionLine', pp.AD_Client_ID, NextNo);
INSERT INTO M_ProductionLine
(M_ProductionLine_ID, M_ProductionPlan_ID, Line,
AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,
M_Product_ID, MovementQty, M_Locator_ID, Description)
VALUES
(NextNo, pp.M_ProductionPlan_ID, Line,
pp.AD_Client_ID,pp.AD_Org_ID,'Y',SysDate,0,SysDate,0,
pp.M_Product_ID, pp.ProductionQty, pp.M_Locator_ID, pp.Description);
-- Create First Level
FOR bom IN CUR_BOM (pp.M_Product_ID) LOOP
ResultStr := 'CreatingLine Products';
Line := Line + 100;
AD_Sequence_Next('M_ProductionLine', pp.AD_Client_ID, NextNo);
INSERT INTO M_ProductionLine
(M_ProductionLine_ID, M_ProductionPlan_ID, Line,
AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,
M_Product_ID, MovementQty, M_Locator_ID)
VALUES
(NextNo, pp.M_ProductionPlan_ID, Line,
pp.AD_Client_ID,pp.AD_Org_ID,'Y',SysDate,0,SysDate,0,
bom.M_ProductBOM_ID, -pp.ProductionQty*bom.BOMQty, pp.M_Locator_ID);
END LOOP;
-- While we have BOMs
LOOP
-- Are there non-stored BOMs to list details?
ResultStr := 'CreatingLine CheckBOM';
SELECT COUNT(*) INTO CountNo
FROM M_ProductionLine pl, M_Product p
WHERE pl.M_Product_ID=p.M_Product_ID
AND pl.M_ProductionPlan_ID=pp.M_ProductionPlan_ID
AND pl.Line<>100 -- Origin Line
AND p.IsBOM='Y' AND p.IsStocked='N';
-- Nothing to do
EXIT WHEN (CountNo = 0);
--
-- Resolve BOMs in ProductLine which are not stocked
FOR pl IN CUR_PLineBOM (pp.M_ProductionPlan_ID) LOOP
ResultStr := 'CreatingLineBOM Resolution';
Line := pl.Line;
-- Resolve BOM Line in product line
FOR bom IN CUR_BOM (pl.M_Product_ID) LOOP
ResultStr := 'CreatingLine Products2';
Line := Line + 10;
AD_Sequence_Next('M_ProductionLine', pp.AD_Client_ID, NextNo);
INSERT INTO M_ProductionLine
(M_ProductionLine_ID, M_ProductionPlan_ID, Line,
AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,
M_Product_ID, MovementQty, M_Locator_ID)
VALUES
(NextNo, pp.M_ProductionPlan_ID, Line,
pp.AD_Client_ID,pp.AD_Org_ID,'Y',SysDate,0,SysDate,0,
bom.M_ProductBOM_ID, pl.MovementQty*bom.BOMQty, pp.M_Locator_ID);
END LOOP;
-- Delete BOM line
DELETE M_ProductionLine
WHERE M_ProductionLine_ID=pl.M_ProductionLine_ID;
END LOOP;
END LOOP; -- While we have BOMs
END LOOP; -- For every Production Plan
-- Modifying locator to have sufficient stock
-- Indicate that it is Created
UPDATE M_Production
SET IsCreated='Y'
WHERE M_Production_ID=Record_ID;
/**************************************************************************
* Post Lines
*/
ELSE
-- All Production Lines
FOR pl IN CUR_PL_Post LOOP
-- M_ProductionLine_ID, AD_Client_ID, AD_Org_ID, MovementDate, M_Product_ID, MovementQty, M_Locator_ID
-- DBMS_OUTPUT.PUT_LINE('ProductionLine=' || pl.M_ProductionLine_ID);
-- DBMS_OUTPUT.PUT_LINE(' Qty=' || pl.MovementQty || ', OnHand=' || BOM_Qty_OnHand(pl.M_Product_ID, NULL, pl.M_Locator_ID));
-- Check Stock levels for reductions
IF (pl.MovementQty < 0 AND MustBeStocked <> 'N'
AND bomQtyOnHand(pl.M_Product_ID, NULL, pl.M_Locator_ID)+pl.MovementQty < 0) THEN
ROLLBACK;
SELECT '@NotEnoughStocked@: ' || Name INTO Message
FROM M_Product WHERE M_Product_ID=pl.M_Product_ID;
GOTO FINISH_PROCESS;
END IF;
-- Adjust Quantity at Location
UPDATE M_Storage
SET QtyOnHand = QtyOnHand + pl.MovementQty,
Updated = SysDate
WHERE M_Locator_ID = pl.M_Locator_ID
AND M_AttributeSetInstance_ID = COALESCE(pl.M_AttributeSetInstance_ID,0)
AND M_Product_ID = pl.M_Product_ID;
-- Product not on Stock yet
IF (SQL%ROWCOUNT = 0) THEN
INSERT INTO M_Storage
(M_Product_ID, M_Locator_ID, M_AttributeSetInstance_ID,
AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
QtyOnHand, QtyReserved, QtyOrdered)
VALUES
(pl.M_Product_ID, pl.M_Locator_ID, COALESCE(pl.M_AttributeSetInstance_ID,0),
pl.AD_Client_ID, pl.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,
pl.MovementQty, 0, 0);
END IF;
-- Create Transaction Entry
ResultStr := 'CreateTransaction';
AD_Sequence_Next('M_Transaction', pl.AD_Org_ID, NextNo);
INSERT INTO M_Transaction
(M_Transaction_ID, M_ProductionLine_ID,
AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
MovementType, M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID,
MovementDate, MovementQty)
VALUES
(NextNo, pl.M_ProductionLine_ID,
pl.AD_Client_ID, pl.AD_Org_ID, 'Y', SysDate, 0, SysDate, 0,
'P+', pl.M_Locator_ID, pl.M_Product_ID, COALESCE(pl.M_AttributeSetInstance_ID,0), -- not distinguishing between assemby/disassembly
pl.MovementDate, pl.MovementQty);
--
UPDATE M_ProductionLine
SET Processed='Y'
WHERE M_ProductionLine_ID=pl.M_ProductionLine_ID;
END LOOP;
-- Indicate that we are done
UPDATE M_Production
SET Processed='Y'
WHERE M_Production_ID=Record_ID;
UPDATE M_ProductionPlan
SET Processed='Y'
WHERE M_Production_ID=Record_ID;
END IF;
-- Only commit when entire job successful
COMMIT;
<<FINISH_PROCESS>>
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || Message);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 1, -- success
ErrorMsg = Message
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
ResultStr := ResultStr || ': ' || SQLERRM || ' - ' || Message;
DBMS_OUTPUT.PUT_LINE(ResultStr);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = ResultStr
WHERE AD_PInstance_ID=PInstance_ID;
COMMIT;
RETURN;
END M_Production_Run;
/

View File

@ -0,0 +1,198 @@
CREATE OR REPLACE PROCEDURE T_InventoryValue_Create
(
p_PInstance_ID IN NUMBER
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2001 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: T_InventoryValue_Create.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Inventory Valuation Temporary Table
* Description:
************************************************************************/
AS
-- Logistice
v_ResultStr VARCHAR2(2000);
v_Message VARCHAR2(2000);
v_Result NUMBER := 1; -- 0=failure
v_Record_ID NUMBER;
v_AD_User_ID NUMBER;
-- Parameter
CURSOR Cur_Parameter (pp_PInstance NUMBER) IS
SELECT i.Record_ID, i.AD_User_ID,
p.ParameterName, p.P_String, p.P_Number, p.P_Date
FROM AD_PInstance i, AD_PInstance_Para p
WHERE i.AD_PInstance_ID=pp_PInstance
AND i.AD_PInstance_ID=p.AD_PInstance_ID(+)
ORDER BY p.SeqNo;
-- Parameter Variables
p_M_PriceList_Version_ID NUMBER(10);
p_DateValue DATE;
p_M_Warehouse_ID NUMBER(10);
p_C_Currency_ID NUMBER(10);
BEGIN
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Processing ' || p_PInstance_ID);
v_ResultStr := 'PInstanceNotFound';
UPDATE AD_PInstance
SET Created = SysDate,
IsProcessing = 'Y'
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
-- Get Parameters
v_ResultStr := 'ReadingParameters';
FOR p IN Cur_Parameter (p_PInstance_ID) LOOP
v_Record_ID := p.Record_ID;
v_AD_User_ID := p.AD_User_ID;
IF (p.ParameterName = 'M_PriceList_Version_ID') THEN
p_M_PriceList_Version_ID := p.P_Number;
DBMS_OUTPUT.PUT_LINE(' M_PriceList_Version_ID=' || p_M_PriceList_Version_ID);
ELSIF (p.ParameterName = 'DateValue') THEN
p_DateValue := p.P_Date;
DBMS_OUTPUT.PUT_LINE(' DateValue=' || p_DateValue);
ELSIF (p.ParameterName = 'M_Warehouse_ID') THEN
p_M_Warehouse_ID := p.P_Number;
DBMS_OUTPUT.PUT_LINE(' M_Warehouse_ID=' || p_M_Warehouse_ID);
ELSIF (p.ParameterName = 'C_Currency_ID') THEN
p_C_Currency_ID := p.P_Number;
DBMS_OUTPUT.PUT_LINE(' C_Currency_ID=' || p_C_Currency_ID);
ELSE
DBMS_OUTPUT.PUT_LINE('*** Unknown Parameter=' || p.ParameterName);
END IF;
END LOOP; -- Get Parameter
DBMS_OUTPUT.PUT_LINE(' Record_ID=' || v_Record_ID);
-- Clear
-- v_ResultStr := 'ClearTable';
-- DELETE T_InventoryValue WHERE M_Warehouse_ID=p_M_Warehouse_ID;
-- COMMIT;
-- Insert Products
v_ResultStr := 'InsertStockedProducts';
INSERT INTO T_InventoryValue
(AD_Client_ID,AD_Org_ID, AD_PInstance_ID, M_Warehouse_ID,M_Product_ID)
SELECT AD_Client_ID,AD_Org_ID, p_PInstance_ID, p_M_Warehouse_ID,M_Product_ID
FROM M_Product
WHERE IsStocked='Y';
--
IF (SQL%ROWCOUNT = 0) THEN
v_Message := '@Created@ = 0';
GOTO FINISH_PROCESS;
END IF;
-- Update Constants
v_ResultStr := 'UpdateConstants';
UPDATE T_InventoryValue
SET DateValue = TRUNC(p_DateValue) + 0.9993,
M_PriceList_Version_ID = p_M_PriceList_Version_ID,
C_Currency_ID = p_C_Currency_ID
WHERE M_Warehouse_ID = p_M_Warehouse_ID;
-- Get current QtyOnHand
v_ResultStr := 'GetQtyOnHand';
UPDATE T_InventoryValue iv
SET QtyOnHand = (SELECT SUM(QtyOnHand) FROM M_Storage s, M_Locator l
WHERE iv.M_Product_ID=s.M_Product_ID
AND l.M_Locator_ID=s.M_Locator_ID
AND l.M_Warehouse_ID=iv.M_Warehouse_ID)
WHERE iv.M_Warehouse_ID = p_M_Warehouse_ID;
-- Adjust for Valuation Date
v_ResultStr := 'AdjustQtyOnHand';
UPDATE T_InventoryValue iv
SET QtyOnHand =
(SELECT iv.QtyOnHand - NVL(SUM(t.MovementQty), 0)
FROM M_Transaction t, M_Locator l
WHERE t.M_Product_ID=iv.M_Product_ID
-- AND t.M_AttributeSetInstance_ID=iv.M_AttributeSetInstance_ID
AND t.MovementDate > iv.DateValue
AND t.M_Locator_ID=l.M_Locator_ID
AND l.M_Warehouse_ID=iv.M_Warehouse_ID)
WHERE iv.M_Warehouse_ID = p_M_Warehouse_ID;
-- Delete Records w/o OnHand Qty
v_ResultStr := 'DeleteZeroQtyOnHand';
DELETE T_InventoryValue
WHERE QtyOnHand=0
OR QtyOnHand IS NULL;
-- Update Prices
v_ResultStr := 'GetPrices';
UPDATE T_InventoryValue iv
SET PricePO =
(SELECT currencyConvert (po.PriceList,po.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
FROM M_Product_PO po WHERE po.M_Product_ID=iv.M_Product_ID
AND po.IsCurrentVendor='Y' AND RowNum=1),
PriceList =
(SELECT currencyConvert(pp.PriceList,pl.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
FROM M_PriceList pl, M_PriceList_Version plv, M_ProductPrice pp
WHERE pp.M_Product_ID=iv.M_Product_ID AND pp.M_PriceList_Version_ID=iv.M_PriceList_Version_ID
AND pp.M_PriceList_Version_ID=plv.M_PriceList_Version_ID
AND plv.M_PriceList_ID=pl.M_PriceList_ID),
PriceStd =
(SELECT currencyConvert(pp.PriceStd,pl.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
FROM M_PriceList pl, M_PriceList_Version plv, M_ProductPrice pp
WHERE pp.M_Product_ID=iv.M_Product_ID AND pp.M_PriceList_Version_ID=iv.M_PriceList_Version_ID
AND pp.M_PriceList_Version_ID=plv.M_PriceList_Version_ID
AND plv.M_PriceList_ID=pl.M_PriceList_ID),
PriceLimit =
(SELECT currencyConvert(pp.PriceLimit,pl.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
FROM M_PriceList pl, M_PriceList_Version plv, M_ProductPrice pp
WHERE pp.M_Product_ID=iv.M_Product_ID AND pp.M_PriceList_Version_ID=iv.M_PriceList_Version_ID
AND pp.M_PriceList_Version_ID=plv.M_PriceList_Version_ID
AND plv.M_PriceList_ID=pl.M_PriceList_ID),
CostStandard =
(SELECT currencyConvert(pc.CurrentCostPrice,acs.C_Currency_ID,iv.C_Currency_ID,iv.DateValue, null, iv.AD_Client_ID, iv.AD_Org_ID)
FROM AD_ClientInfo ci, C_AcctSchema acs, M_Product_Costing pc
WHERE iv.AD_Client_ID=ci.AD_Client_ID AND ci.C_AcctSchema1_ID=acs.C_AcctSchema_ID
AND acs.C_AcctSchema_ID=pc.C_AcctSchema_ID
AND iv.M_Product_ID=pc.M_Product_ID)
WHERE iv.M_Warehouse_ID = p_M_Warehouse_ID;
-- Update Values
v_ResultStr := 'UpdateValue';
UPDATE T_InventoryValue
SET PricePOAmt = QtyOnHand * PricePO,
PriceListAmt = QtyOnHand * PriceList,
PriceStdAmt = QtyOnHand * PriceStd,
PriceLimitAmt = QtyOnHand * PriceLimit,
CostStandardAmt = QtyOnHand * CostStandard
WHERE M_Warehouse_ID = p_M_Warehouse_ID;
v_Message := '@Created@ = ' || SQL%ROWCOUNT;
<<FINISH_PROCESS>>
-- Update AD_PInstance
DBMS_OUTPUT.PUT_LINE('Updating PInstance - Finished ' || v_Message);
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = v_Result, -- 1=success
ErrorMsg = v_Message
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
RETURN;
EXCEPTION
WHEN OTHERS THEN
v_ResultStr := v_ResultStr || ': ' || SQLERRM || ' - ' || v_Message;
DBMS_OUTPUT.PUT_LINE(v_ResultStr);
ROLLBACK;
UPDATE AD_PInstance
SET Updated = SysDate,
IsProcessing = 'N',
Result = 0, -- failure
ErrorMsg = v_ResultStr
WHERE AD_PInstance_ID=p_PInstance_ID;
COMMIT;
RETURN;
END T_InventoryValue_Create;
/

View File

@ -0,0 +1,55 @@
CREATE OR REPLACE PROCEDURE nextID
(
p_AD_Sequence_ID IN NUMBER,
p_System IN CHAR,
o_NextID OUT NUMBER
)
/*************************************************************************
* The contents of this file are subject to the Adempiere License. You may
* obtain a copy of the License at http://www.adempiere.org/license.html
* Software is on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for details. Code: Adempiere ERP+CRM
* Copyright (C) 1999-2005 Jorg Janke, ComPiere, Inc. All Rights Reserved.
*************************************************************************
* $Id: nextID.sql,v 1.1 2006/04/21 17:51:58 jjanke Exp $
***
* Title: Get Next ID - no Commit
* Description:
* Test via
DECLARE
v_NextID NUMBER;
BEGIN
nextID(2, 'Y', v_NextID);
DBMS_OUTPUT.PUT_LINE(v_NextID);
END;
*
************************************************************************/
AS
BEGIN
IF (p_System = 'Y') THEN
SELECT CurrentNextSys
INTO o_NextID
FROM AD_Sequence
WHERE AD_Sequence_ID=p_AD_Sequence_ID
FOR UPDATE OF CurrentNextSys;
--
UPDATE AD_Sequence
SET CurrentNextSys = CurrentNextSys + IncrementNo
WHERE AD_Sequence_ID=p_AD_Sequence_ID;
ELSE
SELECT CurrentNext
INTO o_NextID
FROM AD_Sequence
WHERE AD_Sequence_ID=p_AD_Sequence_ID
FOR UPDATE OF CurrentNext;
--
UPDATE AD_Sequence
SET CurrentNext = CurrentNext + IncrementNo
WHERE AD_Sequence_ID=p_AD_Sequence_ID;
END IF;
--
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END nextID;
/

View File

@ -0,0 +1,20 @@
DROP TABLE T_Selection CASCADE CONSTRAINTS;
CREATE GLOBAL TEMPORARY TABLE T_Selection
(
T_Selection_ID NUMBER(10, 0) NOT NULL
CONSTRAINT T_Selection_Key PRIMARY KEY
)
ON COMMIT DELETE ROWS;
DROP TABLE T_Selection2;
CREATE GLOBAL TEMPORARY TABLE T_Selection2
(
Query_ID NUMBER NOT NULL,
T_Selection_ID NUMBER(10) NOT NULL,
CONSTRAINT T_Selection2_Key PRIMARY KEY (Query_ID,T_Selection_ID)
)
ON COMMIT PRESERVE ROWS;

View File

@ -0,0 +1,8 @@
lib.dir=../lib
schemaoutputfile=../adempiere-model.xml
schemafiles=adempiere-model.xml
datafile=../adempiere-data.xml
sqloutputfile=adempiere-schema.sql
fkoutputfile=adempiere-fk.sql
alterdatabase=false
delimitedsqlidentifiers=true

View File

@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<project default="writeSchemaSqlToFile" name="DdlUtils" basedir=".">
<!-- Allow values set at the commandline or in the environment to override the defaults -->
<property environment="env" />
<!-- Load the jdbc properties as specified by the jdbc.properties.file variable-->
<property file="jdbc.properties.postgresql" />
<!-- Load the build properties -->
<property file="build-ddl.properties" />
<!-- These properties can be overriden on the commandline using -D -->
<property name="catalogpattern" value="" />
<property name="schemapattern" value="${ddlutils.schema}" />
<property name="platform" value="${ddlutils.platform}" />
<!-- The classpath used for running the tasks -->
<path id="project-classpath">
<fileset dir="${lib.dir}">
<include name="**/*.jar" />
<include name="**/*.zip" />
</fileset>
</path>
<taskdef classname="org.apache.ddlutils.task.DdlToDatabaseTask" name="ddlToDatabase" classpathref="project-classpath" />
<taskdef classname="org.apache.ddlutils.task.DatabaseToDdlTask" name="databaseToDdl" classpathref="project-classpath" />
<target name="createDb">
<ddlToDatabase usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<createdatabase failonerror="false">
<parameter name="ENCODING" value="'UTF8'" />
</createdatabase>
</ddlToDatabase>
</target>
<target name="writeSchemaToDb">
<ddlToDatabase validatexml="false" usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<fileset dir="..">
<include name="${schemafiles}" />
</fileset>
<writeschematodatabase alterdatabase="${alterdatabase}" dodrops="true" failonerror="false" />
</ddlToDatabase>
</target>
<target name="writeSchemaSqlToFile">
<ddlToDatabase validatexml="false" usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<fileset dir="..">
<include name="${schemafiles}" />
</fileset>
<writeschemasqltofile alterdatabase="${alterdatabase}" dodrops="false" failonerror="false" createtables="true" createforeignkeys="false" outputfile="${sqloutputfile}" />
</ddlToDatabase>
</target>
<target name="writeFkSqlToFile">
<ddlToDatabase validatexml="false" usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<fileset dir="..">
<include name="${schemafiles}" />
</fileset>
<writeschemasqltofile alterdatabase="${alterdatabase}" dodrops="false" failonerror="false" createtables="false" createforeignkeys="true" outputfile="${fkoutputfile}" />
</ddlToDatabase>
</target>
<target name="writeSchemaToFile">
<databaseToDdl usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<writeSchemaToFile outputfile="${schemaoutputfile}" />
</databaseToDdl>
</target>
<target name="writeDataToFile">
<databaseToDdl usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<writeDataToFile outputfile="${datafile}" />
</databaseToDdl>
</target>
<target name="writeDataToDb">
<ddlToDatabase usedelimitedsqlidentifiers="${delimitedsqlidentifiers}" catalogpattern="${catalogpattern}" schemapattern="${schemapattern}" databasetype="${platform}">
<database driverclassname="${datasource.driverClassName}" url="${datasource.url}" username="${datasource.username}" password="${datasource.password}" />
<fileset dir="..">
<include name="${schemafiles}" />
</fileset>
<writedatatodatabase datafile="${datafile}" usebatchmode="true" batchSize="20" ensureForeignKeyOrder="false" />
</ddlToDatabase>
</target>
</project>

View File

@ -0,0 +1,6 @@
postgresql.home=C:/Program Files/PostgreSQL/8.2
postgresql.database=adempiere
postgresql.user=adempiere
postgresql.password=adempiere1
sqlj.jar.url=file:///d:/Opensource/Applications/Adempiere/sqlj/sqlj.jar

View File

@ -0,0 +1,118 @@
<project name="create-db" default="create" basedir=".">
<property file="build.properties" />
<path id="lib.path">
<fileset dir="../lib">
<include name="**/*.jar" />
</fileset>
</path>
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<fileset dir="../lib">
<include name="**/*.jar" />
</fileset>
</classpath>
</taskdef>
<target name="create" depends="init,create-database,load-functions,create-schema,load-data,load-others">
</target>
<target name="init">
<echo message="============================================================" />
<echo message=" PostgreSQL database create tool for Adempiere ERP" />
<echo message=" Adempiere Licese is GNU GPL License" />
<echo message="============================================================" />
<echo message="" file="log/psql.log" append="false" />
<echo append="false" file="log/build.log" message="#Build log:${line.separator}${line.separator}" />
</target>
<target name="create-database">
<ant antfile="build-ddl.xml" target="createDb" />
</target>
<target name="create-schema">
<echo message="----- Creating tables -----" />
<ant antfile="build-ddl.xml" target="writeSchemaSqlToFile" />
<echo file="log/psql.log" append="true" message="${line.separator}#Create Tables:${line.separator}${line.separator}" />
<antcall target="load">
<param name="file.name" value="${basedir}/adempiere-schema.sql" />
</antcall>
</target>
<target name="load-data">
<echo message="----- Loading Adempiere Seed data -----" />
<unjar src="../adempiere-data.jar" dest=".." />
<ant antfile="build-ddl.xml" target="writeDataToDb" />
<delete file="../adempiere-data.xml" />
</target>
<target name="load-functions">
<echo append="false" file="load_sqlj_functions.sql">
CREATE SCHEMA adempiere;
</echo>
<echo append="true" file="load_sqlj_functions.sql">
SET search_path TO adempiere,sqlj;
</echo>
<echo append="true" file="load_sqlj_functions.sql">
SELECT sqlj.install_jar('${sqlj.jar.url}', 'sqlj', true);
</echo>
<echo append="true" file="load_sqlj_functions.sql">
SELECT sqlj.set_classpath('adempiere', 'sqlj');
</echo>
<echo file="log/psql.log" append="true" message="${line.separator}#Create Functions and Operators:${line.separator}${line.separator}" />
<antcall target="load">
<param name="file.name" value="${basedir}/load_sqlj_functions.sql" />
</antcall>
<antcall target="load">
<param name="file.name" value="${basedir}/init.sql" />
</antcall>
</target>
<target name="load-others">
<echo message="----- Loading other database objects -----" />
<echo file="log/psql.log" append="true" message="${line.separator}#Create Views [1st Pass]:${line.separator}${line.separator}" />
<foreach param="file.name" target="load">
<path>
<fileset dir="../views">
<include name="**" />
</fileset>
</path>
</foreach>
<echo file="log/psql.log" append="true" message="${line.separator}#Create Views [2nd Pass]:${line.separator}${line.separator}" />
<foreach param="file.name" target="load">
<path>
<fileset dir="../views">
<include name="**" />
</fileset>
</path>
</foreach>
<echo file="log/psql.log" append="true" message="${line.separator}#Create Sequences:${line.separator}${line.separator}" />
<foreach param="file.name" target="load">
<path>
<fileset dir="../sequences">
<include name="**" />
</fileset>
</path>
</foreach>
<ant antfile="build-ddl.xml" target="writeFkSqlToFile" />
<echo file="log/psql.log" append="true" message="${line.separator}#Create Foreign Keys:${line.separator}${line.separator}" />
<antcall target="load">
<param name="file.name" value="${basedir}/adempiere-fk.sql" />
</antcall>
</target>
<target name="load">
<echo message="Loading file ${file.name}" />
<exec dir="${postgresql.home}/bin" executable="${postgresql.home}/bin/psql" resultproperty="psql.result" output="log/psql.log" append="true">
<arg line="${postgresql.database}" />
<arg line="${postgresql.user}" />
<arg line="-f ${file.name}" />
<env key="PGPASSWORD" value="${postgresql.password}" />
</exec>
<echo message="File ${file.name} status ${psql.result}" />
<echo append="true" file="log/build.log">File ${file.name} status ${psql.result}</echo>
<echo append="true" file="log/build.log" message="${line.separator}" />
</target>
</project>

View File

@ -0,0 +1,59 @@
/** Change Numeric for Integer */
CREATE OR REPLACE FUNCTION adempiere.ID (record NUMERIC)
RETURNS INTEGER AS $$
DECLARE
ID integer := 0;
BEGIN
ID := CAST(record AS INTEGER);
--RAISE NOTICE 'Quantity here is %', ID;
RETURN ID;
END;
$$ LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION adempiere.getdate()
RETURNS TIMESTAMP WITH TIME ZONE AS $$
BEGIN
RETURN now();
END;
$$ LANGUAGE plpgsql VOLATILE;
/**TIMESTAMP WITH TIME ZONE **/
CREATE OR REPLACE FUNCTION adempiere.addDays (day TIMESTAMP WITH TIME ZONE, days DECIMAL)
RETURNS TIMESTAMP WITH TIME ZONE AS $$
BEGIN
RETURN adempiere.addDays(day,adempiere.ID(days));
END;
$$ LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION adempiere.subtractdays (day TIMESTAMP WITH TIME ZONE, days DECIMAL)
RETURNS TIMESTAMP WITH TIME ZONE AS $$
BEGIN
RETURN adempiere.addDays(day,adempiere.ID(days * -1));
END;
$$ LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION adempiere.addDays (day TIMESTAMP WITH TIME ZONE, days INTEGER)
RETURNS TIMESTAMP WITH TIME ZONE AS $$
BEGIN
RETURN adempiere.addDays(day,Idays);
END;
$$ LANGUAGE plpgsql VOLATILE;
CREATE OR REPLACE FUNCTION adempiere.subtractdays (day TIMESTAMP WITH TIME ZONE, days INTEGER)
RETURNS TIMESTAMP WITH TIME ZONE AS $$
BEGIN
RETURN adempiere.addDays(day,days * -1);
END;
$$ LANGUAGE plpgsql VOLATILE;
DROP OPERATOR adempiere.+ (timestamptz, INTEGER);
CREATE OPERATOR adempiere.+ ( PROCEDURE = adempiere.adddays,
LEFTARG = TIMESTAMPTZ, RIGHTARG = INTEGER,
COMMUTATOR = +);
DROP OPERATOR adempiere.- (timestamptz, INTEGER);
CREATE OPERATOR adempiere.- ( PROCEDURE = adempiere. subtractdays,
LEFTARG = TIMESTAMPTZ, RIGHTARG = INTEGER,
COMMUTATOR = -);

View File

@ -0,0 +1,34 @@
# JDBC properties for PostgreSQL
# Note: Properties starting with "datasource." will be fed into the datasource instance of the
# class configured via the datasource.class property
# Use this property if ddlutils does not recognize the platform from the settings
ddlutils.platform=PostgreSQL
#
# Using the plain DBCP datasource
#
datasource.class=org.apache.commons.dbcp.BasicDataSource
datasource.driverClassName=org.postgresql.Driver
datasource.url=jdbc:postgresql://localhost/adempiere
datasource.username=adempiere
datasource.password=adempiere1
#
# PostgreSQL comes with its own DataSource implementations which can be configured like this:
#
#datasource.class=org.postgresql.ds.PGSimpleDataSource
# or this one for pooling:
#datasource.class=org.postgresql.ds.PGPoolingDataSource
#datasource.serverName=localhost
#datasource.databaseName=ddlutils
#datasource.user=
#datasource.password=
# additional properties for the pooling datasource:
#datasource.dataSourceName=pooling datasource
#datasource.initialConnections=5
#datasource.maxConnections=20

View File

@ -0,0 +1,2 @@
Folder to store log generated from build

View File

@ -0,0 +1,16 @@
DROP SEQUENCE AD_Error_Seq;
CREATE SEQUENCE AD_Error_Seq START WITH 1 INCREMENT BY 1;
DROP SEQUENCE AD_PInstance_Seq;
CREATE SEQUENCE AD_PInstance_Seq START WITH 1 INCREMENT BY 1;
DROP SEQUENCE T_Spool_Seq;
CREATE SEQUENCE T_Spool_Seq START WITH 1 INCREMENT BY 1;
DROP SEQUENCE W_BASKET_SEQ;
CREATE SEQUENCE W_BASKET_SEQ START WITH 1 INCREMENT BY 1;

View File

@ -0,0 +1,16 @@
CREATE OR REPLACE VIEW AD_CHANGELOG_V
(AD_SESSION_ID, AD_CHANGELOG_ID, TABLENAME, RECORD_ID, COLUMNNAME,
OLDVALUE, NEWVALUE, NAME, CREATED)
AS
SELECT l.AD_Session_ID, l.AD_ChangeLog_ID,
t.TableName, l.Record_ID, c.ColumnName,
l.OldValue, l.NewValue,
u.Name, l.Created
FROM AD_ChangeLog l
INNER JOIN AD_Table t ON (l.AD_Table_ID=t.AD_Table_ID)
INNER JOIN AD_Column c ON (l.AD_Column_ID=c.AD_Column_ID)
INNER JOIN AD_User u ON (l.CreatedBy=u.AD_User_ID)
ORDER BY l.AD_Session_ID, l.AD_ChangeLog_ID, t.TableName, l.Record_ID, c.ColumnName;

View File

@ -0,0 +1,36 @@
CREATE OR REPLACE VIEW AD_FIELD_V
(AD_WINDOW_ID, AD_TAB_ID, AD_FIELD_ID, AD_TABLE_ID, AD_COLUMN_ID,
NAME, DESCRIPTION, HELP, ISDISPLAYED, DISPLAYLOGIC,
DISPLAYLENGTH, SEQNO, SORTNO, ISSAMELINE, ISHEADING,
ISFIELDONLY, ISREADONLY, ISENCRYPTEDFIELD, OBSCURETYPE, COLUMNNAME,
COLUMNSQL, FIELDLENGTH, VFORMAT, DEFAULTVALUE, ISKEY,
ISPARENT, ISMANDATORY, ISIDENTIFIER, ISTRANSLATED, AD_REFERENCE_VALUE_ID,
CALLOUT, AD_REFERENCE_ID, AD_VAL_RULE_ID, AD_PROCESS_ID, ISALWAYSUPDATEABLE,
READONLYLOGIC, ISUPDATEABLE, ISENCRYPTEDCOLUMN, ISSELECTIONCOLUMN, TABLENAME,
VALUEMIN, VALUEMAX, FIELDGROUP, VALIDATIONCODE)
AS
SELECT t.AD_Window_ID, f.AD_Tab_ID, f.AD_Field_ID, tbl.AD_Table_ID, f.AD_Column_ID,
f.Name, f.Description, f.Help, f.IsDisplayed, f.DisplayLogic, f.DisplayLength,
f.SeqNo, f.SortNo, f.IsSameLine, f.IsHeading, f.IsFieldOnly, f.IsReadOnly,
f.IsEncrypted AS IsEncryptedField, f.ObscureType,
c.ColumnName, c.ColumnSQL, c.FieldLength, c.VFormat, c.DefaultValue, c.IsKey, c.IsParent,
COALESCE(f.IsMandatory, c.IsMandatory) AS IsMandatory,
c.IsIdentifier, c.IsTranslated, c.AD_Reference_Value_ID,
c.Callout, COALESCE(f.AD_Reference_ID, c.AD_Reference_ID) AS AD_Reference_ID,
c.AD_Val_Rule_ID, c.AD_Process_ID, c.IsAlwaysUpdateable,
c.ReadOnlyLogic, c.IsUpdateable, c.IsEncrypted AS IsEncryptedColumn,
c.IsSelectionColumn,
tbl.TableName, c.ValueMin, c.ValueMax,
fg.Name AS FieldGroup, vr.Code AS ValidationCode
FROM AD_Field f
INNER JOIN AD_Tab t ON (f.AD_Tab_ID = t.AD_Tab_ID)
LEFT OUTER JOIN AD_FieldGroup fg ON (f.AD_FieldGroup_ID = fg.AD_FieldGroup_ID)
LEFT OUTER JOIN AD_Column c ON (f.AD_Column_ID = c.AD_Column_ID)
INNER JOIN AD_Table tbl ON (c.AD_Table_ID = tbl.AD_Table_ID)
INNER JOIN AD_Reference r ON (c.AD_Reference_ID = r.AD_Reference_ID)
LEFT OUTER JOIN AD_Val_Rule vr ON (c.AD_Val_Rule_ID=vr.AD_Val_Rule_ID)
WHERE f.IsActive = 'Y'
AND c.IsActive = 'Y';

View File

@ -0,0 +1,37 @@
CREATE OR REPLACE VIEW AD_FIELD_VT
(AD_LANGUAGE, AD_WINDOW_ID, AD_TAB_ID, AD_FIELD_ID, AD_TABLE_ID,
AD_COLUMN_ID, NAME, DESCRIPTION, HELP, ISDISPLAYED,
DISPLAYLOGIC, DISPLAYLENGTH, SEQNO, SORTNO, ISSAMELINE,
ISHEADING, ISFIELDONLY, ISREADONLY, ISENCRYPTEDFIELD, OBSCURETYPE,
COLUMNNAME, COLUMNSQL, FIELDLENGTH, VFORMAT, DEFAULTVALUE,
ISKEY, ISPARENT, ISMANDATORY, ISIDENTIFIER, ISTRANSLATED,
AD_REFERENCE_VALUE_ID, CALLOUT, AD_REFERENCE_ID, AD_VAL_RULE_ID, AD_PROCESS_ID,
ISALWAYSUPDATEABLE, READONLYLOGIC, ISUPDATEABLE, ISENCRYPTEDCOLUMN, ISSELECTIONCOLUMN,
TABLENAME, VALUEMIN, VALUEMAX, FIELDGROUP, VALIDATIONCODE)
AS
SELECT trl.AD_Language, t.AD_Window_ID, f.AD_Tab_ID, f.AD_Field_ID, tbl.AD_Table_ID, f.AD_Column_ID,
trl.Name, trl.Description, trl.Help, f.IsDisplayed, f.DisplayLogic, f.DisplayLength,
f.SeqNo, f.SortNo, f.IsSameLine, f.IsHeading, f.IsFieldOnly, f.IsReadOnly,
f.IsEncrypted AS IsEncryptedField, f.ObscureType,
c.ColumnName, c.ColumnSQL, c.FieldLength, c.VFormat, c.DefaultValue, c.IsKey, c.IsParent,
COALESCE(f.IsMandatory, c.IsMandatory) AS IsMandatory,
c.IsIdentifier, c.IsTranslated, c.AD_Reference_Value_ID,
c.Callout, COALESCE(f.AD_Reference_ID, c.AD_Reference_ID) AS AD_Reference_ID,
c.AD_Val_Rule_ID, c.AD_Process_ID, c.IsAlwaysUpdateable,
c.ReadOnlyLogic, c.IsUpdateable, c.IsEncrypted AS IsEncryptedColumn, c.IsSelectionColumn,
tbl.TableName, c.ValueMin, c.ValueMax,
fgt.Name AS FieldGroup, vr.Code AS ValidationCode
FROM AD_Field f
INNER JOIN AD_Field_Trl trl ON (f.AD_Field_ID = trl.AD_Field_ID)
INNER JOIN AD_Tab t ON (f.AD_Tab_ID = t.AD_Tab_ID)
LEFT OUTER JOIN AD_FieldGroup_Trl fgt ON
(f.AD_FieldGroup_ID = fgt.AD_FieldGroup_ID AND trl.AD_Language=fgt.AD_Language)
LEFT OUTER JOIN AD_Column c ON (f.AD_Column_ID = c.AD_Column_ID)
INNER JOIN AD_Table tbl ON (c.AD_Table_ID = tbl.AD_Table_ID)
INNER JOIN AD_Reference r ON (c.AD_Reference_ID = r.AD_Reference_ID)
LEFT OUTER JOIN AD_Val_Rule vr ON (c.AD_Val_Rule_ID=vr.AD_Val_Rule_ID)
WHERE f.IsActive = 'Y'
AND c.IsActive = 'Y';

View File

@ -0,0 +1,19 @@
CREATE OR REPLACE VIEW AD_ORG_V
(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
UPDATED, UPDATEDBY, VALUE, NAME, DESCRIPTION,
ISSUMMARY, C_LOCATION_ID, DUNS, TAXID, SUPERVISOR_ID,
PARENT_ORG_ID, AD_ORGTYPE_ID, M_WAREHOUSE_ID, C_BPARTNER_ID)
AS
SELECT o.AD_Client_ID, o.AD_Org_ID,
o.IsActive, o.Created, o.CreatedBy, o.Updated, o.UpdatedBy,
o.Value, o.Name, o.Description, o.IsSummary,
i.C_Location_ID, i.DUNS, i.TaxID,
i.Supervisor_ID, i.Parent_Org_ID,
i.AD_OrgType_ID, i.M_Warehouse_ID,
bp.C_BPartner_ID
FROM AD_Org o
INNER JOIN AD_OrgInfo i ON (o.AD_Org_ID=i.AD_Org_ID)
LEFT OUTER JOIN C_BPartner bp ON (o.AD_Org_ID=bp.AD_OrgBP_ID);

View File

@ -0,0 +1,24 @@
CREATE OR REPLACE VIEW AD_TAB_V
(AD_TAB_ID, AD_WINDOW_ID, AD_TABLE_ID, NAME, DESCRIPTION,
HELP, SEQNO, ISSINGLEROW, HASTREE, ISINFOTAB,
REPLICATIONTYPE, TABLENAME, ACCESSLEVEL, ISSECURITYENABLED, ISDELETEABLE,
ISHIGHVOLUME, ISVIEW, HASASSOCIATION, ISTRANSLATIONTAB, ISREADONLY,
AD_IMAGE_ID, TABLEVEL, WHERECLAUSE, ORDERBYCLAUSE, COMMITWARNING,
READONLYLOGIC, DISPLAYLOGIC, AD_COLUMN_ID, AD_PROCESS_ID, ISSORTTAB,
ISINSERTRECORD, ISADVANCEDTAB, AD_COLUMNSORTORDER_ID, AD_COLUMNSORTYESNO_ID, INCLUDED_TAB_ID)
AS
SELECT t.AD_Tab_ID, t.AD_Window_ID, t.AD_Table_ID, t.Name, t.Description,
t.Help, t.SeqNo, t.IsSingleRow, t.HasTree, t.IsInfoTab, tbl.ReplicationType,
tbl.TableName, tbl.AccessLevel, tbl.IsSecurityEnabled, tbl.IsDeleteable,
tbl.IsHighVolume, tbl.IsView, 'N' AS HasAssociation, -- compatibility
t.IsTranslationTab, t.IsReadOnly, t.AD_Image_ID, t.TabLevel,
t.WhereClause, t.OrderByClause, t.CommitWarning, t.ReadOnlyLogic, t.DisplayLogic,
t.AD_Column_ID, t.AD_Process_ID, t.IsSortTab, t.IsInsertRecord, t.IsAdvancedTab,
t.AD_ColumnSortOrder_ID, t.AD_ColumnSortYesNo_ID, t.Included_Tab_ID
FROM AD_Tab t
INNER JOIN AD_Table tbl ON (t.AD_Table_ID = tbl.AD_Table_ID)
WHERE t.IsActive='Y'
AND tbl.IsActive='Y';

View File

@ -0,0 +1,26 @@
CREATE OR REPLACE VIEW AD_TAB_VT
(AD_LANGUAGE, AD_TAB_ID, AD_WINDOW_ID, AD_TABLE_ID, NAME,
DESCRIPTION, HELP, SEQNO, ISSINGLEROW, HASTREE,
ISINFOTAB, REPLICATIONTYPE, TABLENAME, ACCESSLEVEL, ISSECURITYENABLED,
ISDELETEABLE, ISHIGHVOLUME, ISVIEW, HASASSOCIATION, ISTRANSLATIONTAB,
ISREADONLY, AD_IMAGE_ID, TABLEVEL, WHERECLAUSE, ORDERBYCLAUSE,
COMMITWARNING, READONLYLOGIC, DISPLAYLOGIC, AD_COLUMN_ID, AD_PROCESS_ID,
ISSORTTAB, ISINSERTRECORD, ISADVANCEDTAB, AD_COLUMNSORTORDER_ID, AD_COLUMNSORTYESNO_ID,
INCLUDED_TAB_ID)
AS
SELECT trl.AD_Language, t.AD_Tab_ID, t.AD_Window_ID, t.AD_Table_ID, trl.Name, trl.Description,
trl.Help, t.SeqNo, t.IsSingleRow, t.HasTree, t.IsInfoTab, tbl.ReplicationType,
tbl.TableName, tbl.AccessLevel, tbl.IsSecurityEnabled, tbl.IsDeleteable,
tbl.IsHighVolume, tbl.IsView, 'N' AS HasAssociation, -- compatibility
t.IsTranslationTab, t.IsReadOnly, t.AD_Image_ID, t.TabLevel,
t.WhereClause, t.OrderByClause, trl.CommitWarning, t.ReadOnlyLogic, t.DisplayLogic,
t.AD_Column_ID, t.AD_Process_ID, t.IsSortTab, t.IsInsertRecord, t.IsAdvancedTab,
t.AD_ColumnSortOrder_ID, t.AD_ColumnSortYesNo_ID, t.Included_Tab_ID
FROM AD_Tab t
INNER JOIN AD_Table tbl ON (t.AD_Table_ID = tbl.AD_Table_ID)
INNER JOIN AD_Tab_Trl trl ON (t.AD_Tab_ID = trl.AD_Tab_ID)
WHERE t.IsActive='Y'
AND tbl.IsActive='Y';

View File

@ -0,0 +1,10 @@
CREATE OR REPLACE VIEW AD_USER_ROLES_V
(NAME, ROLENAME)
AS
SELECT u.Name, r.Name AS RoleName
FROM AD_User_Roles ur
INNER JOIN AD_User u ON (ur.AD_User_ID=u.AD_User_ID)
INNER JOIN AD_Role r ON (ur.AD_Role_ID=r.AD_Role_ID);

View File

@ -0,0 +1,15 @@
CREATE OR REPLACE VIEW AD_WINDOW_VT
(AD_LANGUAGE, AD_WINDOW_ID, NAME, DESCRIPTION, HELP,
WINDOWTYPE, AD_COLOR_ID, AD_IMAGE_ID, ISACTIVE, WINWIDTH,
WINHEIGHT, ISSOTRX)
AS
SELECT trl.AD_Language,
bt.AD_Window_ID, trl.Name, trl.Description, trl.Help, bt.WindowType,
bt.AD_Color_ID, bt.AD_Image_ID, bt.IsActive, bt.WinWidth, bt.WinHeight,
bt.IsSOTrx
FROM AD_Window bt
INNER JOIN AD_Window_Trl trl ON (bt.AD_Window_ID=trl.AD_Window_ID)
WHERE bt.IsActive='Y';

View File

@ -0,0 +1,37 @@
CREATE OR REPLACE VIEW C_DUNNING_HEADER_V
(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
UPDATED, UPDATEDBY, AD_LANGUAGE, C_DUNNINGRUN_ID, C_DUNNINGRUNENTRY_ID,
DUNNINGDATE, PRINTNAME, DOCUMENTNOTE, C_BPARTNER_ID, BPVALUE,
BPTAXID, NAICS, DUNS, ORG_LOCATION_ID, TAXID,
SALESREP_ID, SALESREP_NAME, BPGREETING, NAME, NAME2,
BPCONTACTGREETING, TITLE, PHONE, CONTACTNAME, C_LOCATION_ID,
REFERENCENO, POSTAL, AMT, QTY, NOTE)
AS
SELECT dr.AD_Client_ID, dr.AD_Org_ID, dr.IsActive, dr.Created, dr.CreatedBy, dr.Updated, dr.UpdatedBy,
'en_US' AS AD_Language, dr.C_DunningRun_ID, C_DunningRunEntry_ID,
dr.DunningDate, dl.PrintName, dl.Note AS DocumentNote,
dre.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
dre.SalesRep_ID, COALESCE(ubp.Name, u.Name) AS SalesRep_Name,
bpg.Greeting AS BPGreeting,
bp.Name, bp.Name2,
bpcg.Greeting AS BPContactGreeting,
bpc.Title, bpc.Phone,
NULLIF (bpc.Name, bp.Name) AS ContactName,
bpl.C_Location_ID, bp.ReferenceNo, l.Postal || l.Postal_Add AS Postal,
dre.Amt, dre.Qty, dre.Note
FROM C_DunningRun dr
INNER JOIN C_DunningLevel dl ON (dr.C_DunningLevel_ID=dl.C_DunningLevel_ID)
INNER JOIN C_DunningRunEntry dre ON (dr.C_DunningRun_ID=dre.C_DunningRun_ID)
INNER JOIN C_BPartner bp ON (dre.C_BPartner_ID=bp.C_BPartner_ID)
LEFT OUTER JOIN C_Greeting bpg on (bp.C_Greeting_ID=bpg.C_Greeting_ID)
INNER JOIN C_BPartner_Location bpl ON (dre.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
INNER JOIN C_Location l ON (bpl.C_Location_ID=l.C_Location_ID)
LEFT OUTER JOIN AD_User bpc ON (dre.AD_User_ID=bpc.AD_User_ID)
LEFT OUTER JOIN C_Greeting bpcg on (bpc.C_Greeting_ID=bpcg.C_Greeting_ID)
INNER JOIN AD_OrgInfo oi ON (dr.AD_Org_ID=oi.AD_Org_ID)
LEFT OUTER JOIN AD_User u ON (dre.SalesRep_ID=u.AD_User_ID)
LEFT OUTER JOIN C_BPartner ubp ON (u.C_BPartner_ID=ubp.C_BPartner_ID);

View File

@ -0,0 +1,40 @@
CREATE OR REPLACE VIEW C_DUNNING_HEADER_VT
(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
UPDATED, UPDATEDBY, AD_LANGUAGE, C_DUNNINGRUN_ID, C_DUNNINGRUNENTRY_ID,
DUNNINGDATE, PRINTNAME, DOCUMENTNOTE, C_BPARTNER_ID, BPVALUE,
BPTAXID, NAICS, DUNS, ORG_LOCATION_ID, TAXID,
SALESREP_ID, SALESREP_NAME, BPGREETING, NAME, NAME2,
BPCONTACTGREETING, TITLE, PHONE, CONTACTNAME, C_LOCATION_ID,
REFERENCENO, POSTAL, AMT, QTY, NOTE)
AS
SELECT dr.AD_Client_ID, dr.AD_Org_ID, dr.IsActive, dr.Created, dr.CreatedBy, dr.Updated, dr.UpdatedBy,
dlt.AD_Language, dr.C_DunningRun_ID, C_DunningRunEntry_ID,
dr.DunningDate, dlt.PrintName, dlt.Note AS DocumentNote,
dre.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
dre.SalesRep_ID, COALESCE(ubp.Name, u.Name) AS SalesRep_Name,
bpg.Greeting AS BPGreeting,
bp.Name, bp.Name2,
bpcg.Greeting AS BPContactGreeting,
bpc.Title, bpc.Phone,
NULLIF (bpc.Name, bp.Name) AS ContactName,
bpl.C_Location_ID, bp.ReferenceNo, l.Postal || l.Postal_Add AS Postal,
dre.Amt, dre.Qty, dre.Note
FROM C_DunningRun dr
INNER JOIN C_DunningLevel dl ON (dr.C_DunningLevel_ID=dl.C_DunningLevel_ID)
INNER JOIN C_DunningLevel_Trl dlt ON (dl.C_DunningLevel_ID=dlt.C_DunningLevel_ID)
INNER JOIN C_DunningRunEntry dre ON (dr.C_DunningRun_ID=dre.C_DunningRun_ID)
INNER JOIN C_BPartner bp ON (dre.C_BPartner_ID=bp.C_BPartner_ID)
LEFT OUTER JOIN C_Greeting_Trl bpg on (bp.C_Greeting_ID=bpg.C_Greeting_ID
AND dlt.AD_Language=bpg.AD_Language)
INNER JOIN C_BPartner_Location bpl ON (dre.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
INNER JOIN C_Location l ON (bpl.C_Location_ID=l.C_Location_ID)
LEFT OUTER JOIN AD_User bpc ON (dre.AD_User_ID=bpc.AD_User_ID)
LEFT OUTER JOIN C_Greeting_Trl bpcg on (bpc.C_Greeting_ID=bpcg.C_Greeting_ID
AND dlt.AD_Language=bpcg.AD_Language)
INNER JOIN AD_OrgInfo oi ON (dr.AD_Org_ID=oi.AD_Org_ID)
LEFT OUTER JOIN AD_User u ON (dre.SalesRep_ID=u.AD_User_ID)
LEFT OUTER JOIN C_BPartner ubp ON (u.C_BPartner_ID=ubp.C_BPartner_ID);

View File

@ -0,0 +1,50 @@
CREATE OR REPLACE VIEW C_DUNNING_LINE_V
(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
UPDATED, UPDATEDBY, AD_LANGUAGE, C_DUNNINGRUNLINE_ID, C_DUNNINGRUNENTRY_ID,
AMT, CONVERTEDAMT, DAYSDUE, TIMESDUNNED, INTERESTAMT,
FEEAMT, TOTALAMT, C_INVOICE_ID, ISSOTRX, DOCUMENTNO,
DOCSTATUS, DATETRX, C_DOCTYPE_ID, DOCUMENTTYPE, DESCRIPTION,
C_CURRENCY_ID, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, USER1_ID,
USER2_ID, DATEACCT, C_CONVERSIONTYPE_ID, AD_ORGTRX_ID, POREFERENCE,
DATEORDERED, DATEINVOICED, ISINDISPUTE, PAYMENTTERM, C_CHARGE_ID,
CHARGEAMT, TOTALLINES, GRANDTOTAL, AMTINWORDS, M_PRICELIST_ID,
ISPAID, ISALLOCATED, TENDERTYPE, DISCOUNTAMT)
AS
SELECT drl.AD_Client_ID, drl.AD_Org_ID, drl.IsActive, drl.Created, drl.CreatedBy, drl.Updated, drl.UpdatedBy,
'en_US' AS AD_Language,
drl.C_DunningRunLine_ID, drl.C_DunningRunEntry_ID,
drl.Amt, drl.ConvertedAmt, drl.DaysDue, drl.TimesDunned,
drl.InterestAmt, drl.FeeAmt, drl.TotalAmt,
drl.C_Invoice_ID,
COALESCE(i.IsSOTrx,p.IsReceipt) AS IsSOTrx,
COALESCE(i.DocumentNo,p.DocumentNo) AS DocumentNo,
COALESCE(i.DocStatus,p.DocStatus) AS DocStatus,
COALESCE(i.DateInvoiced, p.DateTrx) AS DateTrx,
COALESCE(i.C_DocType_ID,p.C_DocType_ID) AS C_DocType_ID,
COALESCE(dt.PrintName,dtp.PrintName) AS DocumentType,
COALESCE(i.Description,p.Description) AS Description,
COALESCE(i.C_Currency_ID,p.C_Currency_ID) AS C_Currency_ID,
COALESCE(i.C_Campaign_ID,p.C_Campaign_ID) AS C_Campaign_ID,
COALESCE(i.C_Project_ID,p.C_Project_ID) AS C_Project_ID,
COALESCE(i.C_Activity_ID,p.C_Activity_ID) AS C_Activity_ID,
COALESCE(i.User1_ID,p.User1_ID) AS User1_ID,
COALESCE(i.User2_ID,p.User2_ID) AS User2_ID,
COALESCE(i.DateAcct,p.DateAcct) AS DateAcct,
COALESCE(i.C_ConversionType_ID,i.C_ConversionType_ID) AS C_ConversionType_ID,
COALESCE(i.AD_OrgTrx_ID,p.AD_OrgTrx_ID) AS AD_OrgTrx_ID,
i.POReference, i.DateOrdered,
i.DateInvoiced, i.IsInDispute,
pt.Name AS PaymentTerm,
i.C_Charge_ID, i.ChargeAmt,
i.TotalLines, i.GrandTotal, i.GrandTotal AS AmtInWords,
i.M_PriceList_ID, i.IsPaid,
p.IsAllocated, p.TenderType, p.DiscountAmt
FROM C_DunningRunLine drl
LEFT OUTER JOIN C_Invoice i ON (drl.C_Invoice_ID=i.C_Invoice_ID)
LEFT OUTER JOIN C_DocType dt ON (i.C_DocType_ID=dt.C_DocType_ID)
LEFT OUTER JOIN C_PaymentTerm pt ON (i.C_PaymentTerm_ID=pt.C_PaymentTerm_ID)
LEFT OUTER JOIN C_Payment p ON (drl.C_Payment_ID=p.C_Payment_ID)
LEFT OUTER JOIN C_DocType dtp ON (p.C_DocType_ID=dtp.C_DocType_ID);

View File

@ -0,0 +1,52 @@
CREATE OR REPLACE VIEW C_DUNNING_LINE_VT
(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
UPDATED, UPDATEDBY, AD_LANGUAGE, C_DUNNINGRUNLINE_ID, C_DUNNINGRUNENTRY_ID,
AMT, CONVERTEDAMT, DAYSDUE, TIMESDUNNED, INTERESTAMT,
FEEAMT, TOTALAMT, C_INVOICE_ID, ISSOTRX, DOCUMENTNO,
DOCSTATUS, DATETRX, C_DOCTYPE_ID, DOCUMENTTYPE, DESCRIPTION,
C_CURRENCY_ID, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, USER1_ID,
USER2_ID, DATEACCT, C_CONVERSIONTYPE_ID, AD_ORGTRX_ID, POREFERENCE,
DATEORDERED, DATEINVOICED, ISINDISPUTE, PAYMENTTERM, C_CHARGE_ID,
CHARGEAMT, TOTALLINES, GRANDTOTAL, AMTINWORDS, M_PRICELIST_ID,
ISPAID, ISALLOCATED, TENDERTYPE, DISCOUNTAMT)
AS
SELECT drl.AD_Client_ID, drl.AD_Org_ID, drl.IsActive, drl.Created, drl.CreatedBy, drl.Updated, drl.UpdatedBy,
COALESCE(dt.AD_Language,dtp.AD_Language) AS AD_Language,
drl.C_DunningRunLine_ID, drl.C_DunningRunEntry_ID,
drl.Amt, drl.ConvertedAmt, drl.DaysDue, drl.TimesDunned,
drl.InterestAmt, drl.FeeAmt, drl.TotalAmt,
drl.C_Invoice_ID,
COALESCE(i.IsSOTrx,p.IsReceipt) AS IsSOTrx,
COALESCE(i.DocumentNo,p.DocumentNo) AS DocumentNo,
COALESCE(i.DocStatus,p.DocStatus) AS DocStatus,
COALESCE(i.DateInvoiced, p.DateTrx) AS DateTrx,
COALESCE(i.C_DocType_ID,p.C_DocType_ID) AS C_DocType_ID,
COALESCE(dt.PrintName,dtp.PrintName) AS DocumentType,
COALESCE(i.Description,p.Description) AS Description,
COALESCE(i.C_Currency_ID,p.C_Currency_ID) AS C_Currency_ID,
COALESCE(i.C_Campaign_ID,p.C_Campaign_ID) AS C_Campaign_ID,
COALESCE(i.C_Project_ID,p.C_Project_ID) AS C_Project_ID,
COALESCE(i.C_Activity_ID,p.C_Activity_ID) AS C_Activity_ID,
COALESCE(i.User1_ID,p.User1_ID) AS User1_ID,
COALESCE(i.User2_ID,p.User2_ID) AS User2_ID,
COALESCE(i.DateAcct,p.DateAcct) AS DateAcct,
COALESCE(i.C_ConversionType_ID,i.C_ConversionType_ID) AS C_ConversionType_ID,
COALESCE(i.AD_OrgTrx_ID,p.AD_OrgTrx_ID) AS AD_OrgTrx_ID,
i.POReference, i.DateOrdered,
i.DateInvoiced, i.IsInDispute,
pt.Name AS PaymentTerm,
i.C_Charge_ID, i.ChargeAmt,
i.TotalLines, i.GrandTotal, i.GrandTotal AS AmtInWords,
i.M_PriceList_ID, i.IsPaid,
p.IsAllocated, p.TenderType, p.DiscountAmt
FROM C_DunningRunLine drl
LEFT OUTER JOIN C_Invoice i ON (drl.C_Invoice_ID=i.C_Invoice_ID)
LEFT OUTER JOIN C_DocType_Trl dt ON (i.C_DocType_ID=dt.C_DocType_ID)
LEFT OUTER JOIN C_PaymentTerm_Trl pt ON (i.C_PaymentTerm_ID=pt.C_PaymentTerm_ID
AND pt.AD_Language=dt.AD_Language)
LEFT OUTER JOIN C_Payment p ON (drl.C_Payment_ID=p.C_Payment_ID)
LEFT OUTER JOIN C_DocType_Trl dtp ON (p.C_DocType_ID=dtp.C_DocType_ID)
WHERE COALESCE(dt.AD_Language,dtp.AD_Language)=COALESCE(dtp.AD_Language,dt.AD_Language);

View File

@ -0,0 +1,28 @@
CREATE OR REPLACE VIEW C_INVOICELINE_V
(AD_CLIENT_ID, AD_ORG_ID, C_INVOICELINE_ID, C_INVOICE_ID, SALESREP_ID,
C_BPARTNER_ID, M_PRODUCT_ID, DOCUMENTNO, DATEINVOICED, DATEACCT,
ISSOTRX, DOCSTATUS, LINENETAMT, LINELISTAMT, LINELIMITAMT,
LINEDISCOUNTAMT, LINEOVERLIMITAMT, QTYINVOICED, QTYENTERED, LINE,
C_ORDERLINE_ID, C_UOM_ID, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID,
C_PROJECTPHASE_ID, C_PROJECTTASK_ID)
AS
SELECT il.AD_Client_ID, il.AD_Org_ID,
il.C_InvoiceLine_ID, i.C_Invoice_ID, i.SalesRep_ID,
i.C_BPartner_ID, il.M_Product_ID,
i.DocumentNo, i.DateInvoiced, i.DateAcct,
i.IsSOTrx, i.DocStatus,
ROUND(i.Multiplier*LineNetAmt, 2) AS LineNetAmt,
ROUND(i.Multiplier*PriceList*QtyInvoiced, 2) AS LineListAmt,
CASE WHEN COALESCE(il.PriceLimit, 0)=0 THEN ROUND(i.Multiplier*LineNetAmt,2) ELSE ROUND(i.Multiplier*PriceLimit*QtyInvoiced,2) END AS LineLimitAmt,
ROUND(i.Multiplier*PriceList*QtyInvoiced-LineNetAmt,2) AS LineDiscountAmt,
CASE WHEN COALESCE(il.PriceLimit,0)=0 THEN 0 ELSE ROUND(i.Multiplier*LineNetAmt-PriceLimit*QtyInvoiced,2) END AS LineOverLimitAmt,
il.QtyInvoiced, il.QtyEntered,
il.Line, il.C_OrderLine_ID, il.C_UOM_ID,
il.C_Campaign_ID, il.C_Project_ID, il.C_Activity_ID, il.C_ProjectPhase_ID, il.C_ProjectTask_ID
FROM C_Invoice_v i, C_InvoiceLine il
WHERE i.C_Invoice_ID=il.C_Invoice_ID;
--COMMENT ON TABLE C_INVOICELINE_V IS 'Invoice Line Summary for Reporting Views - Corrected for Credit Memos';

View File

@ -0,0 +1,54 @@
CREATE OR REPLACE VIEW C_INVOICE_CANDIDATE_V
(AD_CLIENT_ID, AD_ORG_ID, C_BPARTNER_ID, C_ORDER_ID, DOCUMENTNO,
DATEORDERED, C_DOCTYPE_ID, TOTALLINES)
AS
SELECT
o.AD_Client_ID, o.AD_Org_ID, o.C_BPartner_ID, o.C_Order_ID,
o.DocumentNo, o.DateOrdered, o.C_DocType_ID,
SUM((l.QtyOrdered-l.QtyInvoiced)*l.PriceActual) AS TotalLines
FROM C_Order o
INNER JOIN C_OrderLine l ON (o.C_Order_ID=l.C_Order_ID)
INNER JOIN C_BPartner bp ON (o.C_BPartner_ID=bp.C_BPartner_ID)
LEFT OUTER JOIN C_InvoiceSchedule si ON (bp.C_InvoiceSchedule_ID=si.C_InvoiceSchedule_ID)
WHERE o.DocStatus IN ('CO','CL','IP') -- Standard Orders are IP
-- not Offers and open Walkin-Receipts
AND o.C_DocType_ID IN (SELECT C_DocType_ID FROM C_DocType
WHERE DocBaseType='SOO' AND DocSubTypeSO NOT IN ('ON','OB','WR'))
-- we need to invoice
AND l.QtyOrdered <> l.QtyInvoiced
--
AND (
-- Immediate
o.InvoiceRule='I'
-- Order compete ** not supported **
OR o.InvoiceRule='O'
-- Delivery
OR (o.InvoiceRule='D' AND l.QtyInvoiced<>l.QtyDelivered)
-- Order Schedule, but none defined on Business Partner level
OR (o.InvoiceRule='S' AND bp.C_InvoiceSchedule_ID IS NULL)
-- Schedule defined at BP
OR (o.InvoiceRule='S' AND bp.C_InvoiceSchedule_ID IS NOT NULL AND
(
-- Daily or none
(si.InvoiceFrequency IS NULL OR si.InvoiceFrequency='D')
-- Weekly
OR (si.InvoiceFrequency='W')
-- Bi-Monthly
OR (si.InvoiceFrequency='T'
AND ((TRUNC(o.DateOrdered) <= firstOf(getdate(),'MM')+si.InvoiceDayCutoff-1
AND TRUNC(getdate()) >= firstOf(o.DateOrdered,'MM')+si.InvoiceDay-1)
OR (TRUNC(o.DateOrdered) <= firstOf(getdate(),'MM')+si.InvoiceDayCutoff+14
AND TRUNC(getdate()) >= firstOf(o.DateOrdered,'MM')+si.InvoiceDay+14))
)
-- Monthly
OR (si.InvoiceFrequency='M'
AND TRUNC(o.DateOrdered) <= firstOf(getdate(),'MM')+si.InvoiceDayCutoff-1 -- after cutoff
AND TRUNC(getdate()) >= firstOf(o.DateOrdered,'MM')+si.InvoiceDay-1) -- after invoice day
)
)
)
GROUP BY o.AD_Client_ID, o.AD_Org_ID, o.C_BPartner_ID, o.C_Order_ID,
o.DocumentNo, o.DateOrdered, o.C_DocType_ID;

View File

@ -0,0 +1,56 @@
CREATE OR REPLACE VIEW C_INVOICE_HEADER_V
(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
UPDATED, UPDATEDBY, AD_LANGUAGE, C_INVOICE_ID, ISSOTRX,
DOCUMENTNO, DOCSTATUS, C_DOCTYPE_ID, C_BPARTNER_ID, BPVALUE,
BPTAXID, NAICS, DUNS, ORG_LOCATION_ID, TAXID,
DOCUMENTTYPE, DOCUMENTTYPENOTE, C_ORDER_ID, SALESREP_ID, SALESREP_NAME,
DATEINVOICED, BPGREETING, NAME, NAME2, BPCONTACTGREETING,
TITLE, PHONE, CONTACTNAME, C_LOCATION_ID, REFERENCENO,
POSTAL, DESCRIPTION, POREFERENCE, DATEORDERED, C_CURRENCY_ID,
PAYMENTTERM, PAYMENTTERMNOTE, C_CHARGE_ID, CHARGEAMT, TOTALLINES,
GRANDTOTAL, AMTINWORDS, M_PRICELIST_ID, ISTAXINCLUDED, C_CAMPAIGN_ID,
C_PROJECT_ID, C_ACTIVITY_ID, ISPAID)
AS
SELECT i.AD_Client_ID, i.AD_Org_ID, i.IsActive, i.Created, i.CreatedBy, i.Updated, i.UpdatedBy,
'en_US' AS AD_Language,
i.C_Invoice_ID, i.IsSOTrx, i.DocumentNo, i.DocStatus, i.C_DocType_ID,
i.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
dt.PrintName AS DocumentType, dt.DocumentNote AS DocumentTypeNote,
i.C_Order_ID, i.SalesRep_ID, COALESCE(ubp.Name, u.Name) AS SalesRep_Name,
i.DateInvoiced,
bpg.Greeting AS BPGreeting,
bp.Name, bp.Name2,
bpcg.Greeting AS BPContactGreeting,
bpc.Title, bpc.Phone,
NULLIF (bpc.Name, bp.Name) AS ContactName,
bpl.C_Location_ID, bp.ReferenceNo, l.Postal || l.Postal_Add AS Postal,
i.Description,
i.POReference,
i.DateOrdered,
i.C_Currency_ID,
pt.Name AS PaymentTerm, pt.DocumentNote AS PaymentTermNote,
i.C_Charge_ID, i.ChargeAmt,
i.TotalLines,
i.GrandTotal, i.GrandTotal AS AmtInWords,
i.M_PriceList_ID,
i.IsTaxIncluded,
i.C_Campaign_ID,
i.C_Project_ID,
i.C_Activity_ID,
i.IsPaid
FROM C_Invoice i
INNER JOIN C_DocType dt ON (i.C_DocType_ID=dt.C_DocType_ID)
INNER JOIN C_PaymentTerm pt ON (i.C_PaymentTerm_ID=pt.C_PaymentTerm_ID)
INNER JOIN C_BPartner bp ON (i.C_BPartner_ID=bp.C_BPartner_ID)
LEFT OUTER JOIN C_Greeting bpg on (bp.C_Greeting_ID=bpg.C_Greeting_ID)
INNER JOIN C_BPartner_Location bpl ON (i.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
INNER JOIN C_Location l ON (bpl.C_Location_ID=l.C_Location_ID)
LEFT OUTER JOIN AD_User bpc ON (i.AD_User_ID=bpc.AD_User_ID)
LEFT OUTER JOIN C_Greeting bpcg on (bpc.C_Greeting_ID=bpcg.C_Greeting_ID)
INNER JOIN AD_OrgInfo oi ON (i.AD_Org_ID=oi.AD_Org_ID)
LEFT OUTER JOIN AD_User u ON (i.SalesRep_ID=u.AD_User_ID)
LEFT OUTER JOIN C_BPartner ubp ON (u.C_BPartner_ID=ubp.C_BPartner_ID);

View File

@ -0,0 +1,56 @@
CREATE OR REPLACE VIEW C_INVOICE_HEADER_VT
(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
UPDATED, UPDATEDBY, AD_LANGUAGE, C_INVOICE_ID, ISSOTRX,
DOCUMENTNO, DOCSTATUS, C_DOCTYPE_ID, C_BPARTNER_ID, BPVALUE,
BPTAXID, NAICS, DUNS, ORG_LOCATION_ID, TAXID,
DOCUMENTTYPE, DOCUMENTTYPENOTE, C_ORDER_ID, SALESREP_ID, SALESREP_NAME,
DATEINVOICED, BPGREETING, NAME, NAME2, BPCONTACTGREETING,
TITLE, PHONE, CONTACTNAME, C_LOCATION_ID, REFERENCENO,
POSTAL, DESCRIPTION, POREFERENCE, DATEORDERED, C_CURRENCY_ID,
PAYMENTTERM, PAYMENTTERMNOTE, C_CHARGE_ID, CHARGEAMT, TOTALLINES,
GRANDTOTAL, AMTINWORDS, M_PRICELIST_ID, ISTAXINCLUDED, C_CAMPAIGN_ID,
C_PROJECT_ID, C_ACTIVITY_ID, ISPAID)
AS
SELECT i.AD_Client_ID, i.AD_Org_ID, i.IsActive, i.Created, i.CreatedBy, i.Updated, i.UpdatedBy,
dt.AD_Language,
i.C_Invoice_ID, i.IsSOTrx, i.DocumentNo, i.DocStatus, i.C_DocType_ID,
i.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
dt.PrintName AS DocumentType, dt.DocumentNote AS DocumentTypeNote,
i.C_Order_ID, i.SalesRep_ID, COALESCE(ubp.Name, u.Name) AS SalesRep_Name,
i.DateInvoiced,
bpg.Greeting AS BPGreeting,
bp.Name, bp.Name2,
bpcg.Greeting AS BPContactGreeting,
bpc.Title, bpc.Phone,
NULLIF (bpc.Name, bp.Name) AS ContactName,
bpl.C_Location_ID, bp.ReferenceNo, l.Postal || l.Postal_Add AS Postal,
i.Description,
i.POReference,
i.DateOrdered,
i.C_Currency_ID,
pt.Name AS PaymentTerm, pt.DocumentNote AS PaymentTermNote,
i.C_Charge_ID, i.ChargeAmt,
i.TotalLines,
i.GrandTotal, i.GrandTotal AS AmtInWords,
i.M_PriceList_ID,
i.IsTaxIncluded,
i.C_Campaign_ID,
i.C_Project_ID,
i.C_Activity_ID,
i.IsPaid
FROM C_Invoice i
INNER JOIN C_DocType_Trl dt ON (i.C_DocType_ID=dt.C_DocType_ID)
INNER JOIN C_PaymentTerm_Trl pt ON (i.C_PaymentTerm_ID=pt.C_PaymentTerm_ID AND dt.AD_Language=pt.AD_Language)
INNER JOIN C_BPartner bp ON (i.C_BPartner_ID=bp.C_BPartner_ID)
LEFT OUTER JOIN C_Greeting_Trl bpg on (bp.C_Greeting_ID=bpg.C_Greeting_ID AND dt.AD_Language=bpg.AD_Language)
INNER JOIN C_BPartner_Location bpl ON (i.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
INNER JOIN C_Location l ON (bpl.C_Location_ID=l.C_Location_ID)
LEFT OUTER JOIN AD_User bpc ON (i.AD_User_ID=bpc.AD_User_ID)
LEFT OUTER JOIN C_Greeting_Trl bpcg on (bpc.C_Greeting_ID=bpcg.C_Greeting_ID AND dt.AD_Language=bpcg.AD_Language)
INNER JOIN AD_OrgInfo oi ON (i.AD_Org_ID=oi.AD_Org_ID)
LEFT OUTER JOIN AD_User u ON (i.SalesRep_ID=u.AD_User_ID)
LEFT OUTER JOIN C_BPartner ubp ON (u.C_BPartner_ID=ubp.C_BPartner_ID);

View File

@ -0,0 +1,114 @@
CREATE OR REPLACE VIEW C_INVOICE_LINETAX_V
(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
UPDATED, UPDATEDBY, AD_LANGUAGE, C_INVOICE_ID, C_INVOICELINE_ID,
C_TAX_ID, TAXAMT, LINETOTALAMT, TAXINDICATOR, LINE,
M_PRODUCT_ID, QTYINVOICED, QTYENTERED, UOMSYMBOL, NAME,
DESCRIPTION, DOCUMENTNOTE, UPC, SKU, PRODUCTVALUE,
RESOURCEDESCRIPTION, PRICELIST, PRICEENTEREDLIST, DISCOUNT, PRICEACTUAL,
PRICEENTERED, LINENETAMT, M_ATTRIBUTESETINSTANCE_ID, M_ATTRIBUTESET_ID, SERNO,
LOT, M_LOT_ID, GUARANTEEDATE, PRODUCTDESCRIPTION, IMAGEURL,
C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, C_PROJECTPHASE_ID, C_PROJECTTASK_ID)
AS
SELECT il.AD_Client_ID, il.AD_Org_ID, il.IsActive, il.Created, il.CreatedBy, il.Updated, il.UpdatedBy,
'en_US' AS AD_Language,
il.C_Invoice_ID, il.C_InvoiceLine_ID,
il.C_Tax_ID, il.TaxAmt, il.LineTotalAmt, t.TaxIndicator,
il.Line, p.M_Product_ID,
CASE WHEN il.QtyInvoiced<>0 OR il.M_Product_ID IS NOT NULL THEN il.QtyInvoiced END AS QtyInvoiced,
CASE WHEN il.QtyEntered<>0 OR il.M_Product_ID IS NOT NULL THEN il.QtyEntered END AS QtyEntered,
CASE WHEN il.QtyEntered<>0 OR il.M_Product_ID IS NOT NULL THEN uom.UOMSymbol END AS UOMSymbol,
COALESCE(c.Name,p.Name||productAttribute(il.M_AttributeSetInstance_ID), il.Description) AS Name, -- main line
CASE WHEN COALESCE(c.Name,p.Name) IS NOT NULL THEN il.Description END AS Description, -- second line
p.DocumentNote, -- third line
p.UPC, p.SKU, COALESCE(pp.VendorProductNo,p.Value) AS ProductValue,
ra.Description AS ResourceDescription, -- forth line
CASE WHEN i.IsDiscountPrinted='Y' AND il.PriceList<>0
THEN il.PriceList END AS PriceList,
CASE WHEN i.IsDiscountPrinted='Y' AND il.PriceList<>0 AND il.QtyEntered<>0
THEN il.PriceList*il.QtyInvoiced/il.QtyEntered END AS PriceEnteredList,
CASE WHEN i.IsDiscountPrinted='Y' AND il.PriceList>il.PriceActual AND il.PriceList<>0
THEN (il.PriceList-il.PriceActual)/il.PriceList*100 END AS Discount,
CASE WHEN il.PriceActual<>0 OR il.M_Product_ID IS NOT NULL THEN il.PriceActual END AS PriceActual,
CASE WHEN il.PriceEntered<>0 OR il.M_Product_ID IS NOT NULL THEN il.PriceEntered END AS PriceEntered,
CASE WHEN il.LineNetAmt<>0 OR il.M_Product_ID IS NOT NULL THEN il.LineNetAmt END AS LineNetAmt,
il.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID,
asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate,
p.Description as ProductDescription, p.ImageURL,
il.C_Campaign_ID, il.C_Project_ID, il.C_Activity_ID, il.C_ProjectPhase_ID, il.C_ProjectTask_ID
FROM C_InvoiceLine il
INNER JOIN C_UOM uom ON (il.C_UOM_ID=uom.C_UOM_ID)
INNER JOIN C_Invoice i ON (il.C_Invoice_ID=i.C_Invoice_ID)
LEFT OUTER JOIN C_Tax t ON (il.C_Tax_ID=t.C_Tax_ID)
LEFT OUTER JOIN M_Product p ON (il.M_Product_ID=p.M_Product_ID)
LEFT OUTER JOIN C_Charge c ON (il.C_Charge_ID=c.C_Charge_ID)
LEFT OUTER JOIN C_BPartner_Product pp ON (il.M_Product_ID=pp.M_Product_ID AND i.C_BPartner_ID=pp.C_BPartner_ID)
LEFT OUTER JOIN S_ResourceAssignment ra ON (il.S_ResourceAssignment_ID=ra.S_ResourceAssignment_ID)
LEFT OUTER JOIN M_AttributeSetInstance asi ON (il.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
UNION -- bom lines
SELECT il.AD_Client_ID, il.AD_Org_ID, il.IsActive, il.Created, il.CreatedBy, il.Updated, il.UpdatedBy,
'en_US' AS AD_Language,
il.C_Invoice_ID, il.C_InvoiceLine_ID,
il.C_Tax_ID, il.TaxAmt, il.LineTotalAmt, t.TaxIndicator,
il.Line+(b.Line/100) AS Line, p.M_Product_ID,
il.QtyInvoiced*b.BOMQty AS QtyInvoiced,
il.QtyEntered*b.BOMQty AS QtyEntered,
uom.UOMSymbol,
p.Name, -- main
b.Description,
p.DocumentNote, p.UPC, p.SKU, p.Value AS ProductValue,
null, null, null, null, null, null, null,
il.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate,
p.Description as ProductDescription, p.ImageURL,
il.C_Campaign_ID, il.C_Project_ID, il.C_Activity_ID, il.C_ProjectPhase_ID, il.C_ProjectTask_ID
FROM M_Product_BOM b -- BOM lines
INNER JOIN C_InvoiceLine il ON (b.M_Product_ID=il.M_Product_ID)
INNER JOIN M_Product bp ON (bp.M_Product_ID=il.M_Product_ID -- BOM Product
AND bp.IsBOM='Y' AND bp.IsVerified='Y' AND bp.IsInvoicePrintDetails='Y')
INNER JOIN M_Product p ON (b.M_ProductBOM_ID=p.M_Product_ID) -- BOM line product
INNER JOIN C_UOM uom ON (p.C_UOM_ID=uom.C_UOM_ID)
LEFT OUTER JOIN C_Tax t ON (il.C_Tax_ID=t.C_Tax_ID)
LEFT OUTER JOIN M_AttributeSetInstance asi ON (il.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
UNION -- comment lines
SELECT il.AD_Client_ID, il.AD_Org_ID, il.IsActive, il.Created, il.CreatedBy, il.Updated, il.UpdatedBy,
'en_US', il.C_Invoice_ID, il.C_InvoiceLine_ID,
null, null, null, null,
il.Line, null,
null, null, null,
il.Description,
null, null, null, null, null, null,
null, null, null, null, null, null,
null, null, null, null, null, null, null, null,
null, null, null, null, null
FROM C_InvoiceLine il
WHERE il.C_UOM_ID IS NULL
UNION -- empty line
SELECT AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
'en_US', C_Invoice_ID, null,
null, null, null, null,
9998, null,
null, null, null,
null,
null, null, null, null, null, null,
null, null, null, null, null, null,
null, null, null, null, null, null, null, null,
null, null, null, null, null
FROM C_Invoice
UNION -- tax lines
SELECT it.AD_Client_ID, it.AD_Org_ID, it.IsActive, it.Created, it.CreatedBy, it.Updated, it.UpdatedBy,
'en_US', it.C_Invoice_ID, null,
it.C_Tax_ID, null, null, t.TaxIndicator,
9999, null,
null, null, null,
t.Name,
null, null, null, null, null, null,
null, null, null,
CASE WHEN it.IsTaxIncluded='Y' THEN it.TaxAmt ELSE it.TaxBaseAmt END,
CASE WHEN it.IsTaxIncluded='Y' THEN it.TaxAmt ELSE it.TaxBaseAmt END,
CASE WHEN it.IsTaxIncluded='Y' THEN NULL ELSE it.TaxAmt END,
null, null, null, null, null, null, null, null,
null, null, null, null, null
FROM C_InvoiceTax it
INNER JOIN C_Tax t ON (it.C_Tax_ID=t.C_Tax_ID);

View File

@ -0,0 +1,117 @@
CREATE OR REPLACE VIEW C_INVOICE_LINETAX_VT
(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
UPDATED, UPDATEDBY, AD_LANGUAGE, C_INVOICE_ID, C_INVOICELINE_ID,
C_TAX_ID, TAXAMT, LINETOTALAMT, TAXINDICATOR, LINE,
M_PRODUCT_ID, QTYINVOICED, QTYENTERED, UOMSYMBOL, NAME,
DESCRIPTION, DOCUMENTNOTE, UPC, SKU, PRODUCTVALUE,
RESOURCEDESCRIPTION, PRICELIST, PRICEENTEREDLIST, DISCOUNT, PRICEACTUAL,
PRICEENTERED, LINENETAMT, M_ATTRIBUTESETINSTANCE_ID, M_ATTRIBUTESET_ID, SERNO,
LOT, M_LOT_ID, GUARANTEEDATE, PRODUCTDESCRIPTION, IMAGEURL,
C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, C_PROJECTPHASE_ID, C_PROJECTTASK_ID)
AS
SELECT il.AD_Client_ID, il.AD_Org_ID, il.IsActive, il.Created, il.CreatedBy, il.Updated, il.UpdatedBy,
uom.AD_Language,
il.C_Invoice_ID, il.C_InvoiceLine_ID,
il.C_Tax_ID, il.TaxAmt, il.LineTotalAmt, t.TaxIndicator,
il.Line, p.M_Product_ID,
CASE WHEN il.QtyInvoiced<>0 OR il.M_Product_ID IS NOT NULL THEN il.QtyInvoiced END AS QtyInvoiced,
CASE WHEN il.QtyEntered<>0 OR il.M_Product_ID IS NOT NULL THEN il.QtyEntered END AS QtyEntered,
CASE WHEN il.QtyEntered<>0 OR il.M_Product_ID IS NOT NULL THEN uom.UOMSymbol END AS UOMSymbol,
COALESCE(c.Name,COALESCE(pt.Name,p.Name)||productAttribute(il.M_AttributeSetInstance_ID), il.Description) AS Name, -- main line
CASE WHEN COALESCE(c.Name,pt.Name,p.Name) IS NOT NULL THEN il.Description END AS Description, -- second line
COALESCE(pt.DocumentNote,p.DocumentNote) AS DocumentNote, -- third line
p.UPC, p.SKU, COALESCE(pp.VendorProductNo,p.Value) AS ProductValue,
ra.Description AS ResourceDescription, -- forth line
CASE WHEN i.IsDiscountPrinted='Y' AND il.PriceList<>0
THEN il.PriceList END AS PriceList,
CASE WHEN i.IsDiscountPrinted='Y' AND il.PriceList<>0 AND il.QtyEntered<>0
THEN il.PriceList*il.QtyInvoiced/il.QtyEntered END AS PriceEnteredList,
CASE WHEN i.IsDiscountPrinted='Y' AND il.PriceList>il.PriceActual AND il.PriceList<>0
THEN (il.PriceList-il.PriceActual)/il.PriceList*100 END AS Discount,
CASE WHEN il.PriceActual<>0 OR il.M_Product_ID IS NOT NULL THEN il.PriceActual END AS PriceActual,
CASE WHEN il.PriceEntered<>0 OR il.M_Product_ID IS NOT NULL THEN il.PriceEntered END AS PriceEntered,
CASE WHEN il.LineNetAmt<>0 OR il.M_Product_ID IS NOT NULL THEN il.LineNetAmt END AS LineNetAmt,
il.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate,
pt.Description as ProductDescription, p.ImageURL,
il.C_Campaign_ID, il.C_Project_ID, il.C_Activity_ID, il.C_ProjectPhase_ID, il.C_ProjectTask_ID
FROM C_InvoiceLine il
INNER JOIN C_UOM_Trl uom ON (il.C_UOM_ID=uom.C_UOM_ID)
INNER JOIN C_Invoice i ON (il.C_Invoice_ID=i.C_Invoice_ID)
LEFT OUTER JOIN C_Tax_Trl t ON (il.C_Tax_ID=t.C_Tax_ID AND uom.AD_Language=t.AD_Language)
LEFT OUTER JOIN M_Product p ON (il.M_Product_ID=p.M_Product_ID)
LEFT OUTER JOIN C_Charge c ON (il.C_Charge_ID=c.C_Charge_ID)
LEFT OUTER JOIN C_BPartner_Product pp ON (il.M_Product_ID=pp.M_Product_ID AND i.C_BPartner_ID=pp.C_BPartner_ID)
LEFT OUTER JOIN M_Product_Trl pt ON (il.M_Product_ID=pt.M_Product_ID AND uom.AD_Language=pt.AD_Language)
LEFT OUTER JOIN S_ResourceAssignment ra ON (il.S_ResourceAssignment_ID=ra.S_ResourceAssignment_ID)
LEFT OUTER JOIN M_AttributeSetInstance asi ON (il.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
UNION -- bom lines
SELECT il.AD_Client_ID, il.AD_Org_ID, il.IsActive, il.Created, il.CreatedBy, il.Updated, il.UpdatedBy,
uom.AD_Language,
il.C_Invoice_ID, il.C_InvoiceLine_ID,
il.C_Tax_ID, il.TaxAmt, il.LineTotalAmt, t.TaxIndicator,
il.Line+(b.Line/100) AS Line, p.M_Product_ID,
il.QtyInvoiced*b.BOMQty AS QtyInvoiced,
il.QtyEntered*b.BOMQty AS QtyEntered,
uom.UOMSymbol,
COALESCE(pt.Name,p.Name) AS Name, -- main
b.Description,
COALESCE(pt.DocumentNote,p.DocumentNote) AS DocumentNote, p.UPC, p.SKU, p.Value AS ProductValue,
null, null, null, null, null, null, null,
il.M_AttributeSetInstance_ID, asi.M_AttributeSet_ID, asi.SerNo, asi.Lot, asi.M_Lot_ID,asi.GuaranteeDate,
pt.Description as ProductDescription, p.ImageURL,
il.C_Campaign_ID, il.C_Project_ID, il.C_Activity_ID, il.C_ProjectPhase_ID, il.C_ProjectTask_ID
FROM M_Product_BOM b -- BOM lines
INNER JOIN C_InvoiceLine il ON (b.M_Product_ID=il.M_Product_ID)
INNER JOIN M_Product bp ON (bp.M_Product_ID=il.M_Product_ID -- BOM Product
AND bp.IsBOM='Y' AND bp.IsVerified='Y' AND bp.IsInvoicePrintDetails='Y')
INNER JOIN M_Product p ON (b.M_ProductBOM_ID=p.M_Product_ID) -- BOM line product
INNER JOIN C_UOM_Trl uom ON (p.C_UOM_ID=uom.C_UOM_ID)
INNER JOIN M_Product_Trl pt ON (b.M_ProductBOM_ID=pt.M_Product_ID AND uom.AD_Language=pt.AD_Language)
LEFT OUTER JOIN C_Tax t ON (il.C_Tax_ID=t.C_Tax_ID)
LEFT OUTER JOIN M_AttributeSetInstance asi ON (il.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)
UNION -- comment line
SELECT il.AD_Client_ID, il.AD_Org_ID, il.IsActive, il.Created, il.CreatedBy, il.Updated, il.UpdatedBy,
l.AD_Language, il.C_Invoice_ID, il.C_InvoiceLine_ID,
null, null, null, null,
il.Line, null,
null, null, null,
il.Description,
null, null, null, null, null, null,
null, null, null, null, null, null,
null, null, null, null, null, null, null, null,
null,null,null,null,null
FROM C_InvoiceLine il, AD_Language l
WHERE il.C_UOM_ID IS NULL
AND l.IsBaseLanguage='N' AND l.IsSystemLanguage='Y'
UNION -- empty line
SELECT i.AD_Client_ID, i.AD_Org_ID, i.IsActive, i.Created, i.CreatedBy, i.Updated, i.UpdatedBy,
AD_Language, i.C_Invoice_ID, null,
null, null, null, null,
9998, null,
null, null, null,
null,
null, null, null, null, null, null,
null, null, null, null, null, null,
null, null, null, null, null, null, null, null,
null,null,null,null,null
FROM C_Invoice i, AD_Language l
WHERE l.IsBaseLanguage='N' AND l.IsSystemLanguage='Y'
UNION -- tax lines
SELECT it.AD_Client_ID, it.AD_Org_ID, it.IsActive, it.Created, it.CreatedBy, it.Updated, it.UpdatedBy,
t.AD_Language, it.C_Invoice_ID, null,
it.C_Tax_ID, null, null, t.TaxIndicator,
9999, null,
null, null, null,
t.Name,
null, null, null, null, null, null,
null, null, null,
CASE WHEN it.IsTaxIncluded='Y' THEN it.TaxAmt ELSE it.TaxBaseAmt END,
CASE WHEN it.IsTaxIncluded='Y' THEN it.TaxAmt ELSE it.TaxBaseAmt END,
CASE WHEN it.IsTaxIncluded='Y' THEN NULL ELSE it.TaxAmt END,
null, null, null, null, null, null, null, null,
null,null,null,null,null
FROM C_InvoiceTax it
INNER JOIN C_Tax_Trl t ON (it.C_Tax_ID=t.C_Tax_ID);

View File

@ -0,0 +1,53 @@
CREATE OR REPLACE VIEW C_INVOICE_V
(C_INVOICE_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
CREATEDBY, UPDATED, UPDATEDBY, ISSOTRX, DOCUMENTNO,
DOCSTATUS, DOCACTION, PROCESSING, PROCESSED, C_DOCTYPE_ID,
C_DOCTYPETARGET_ID, C_ORDER_ID, DESCRIPTION, ISAPPROVED, ISTRANSFERRED,
SALESREP_ID, DATEINVOICED, DATEPRINTED, DATEACCT, C_BPARTNER_ID,
C_BPARTNER_LOCATION_ID, AD_USER_ID, POREFERENCE, DATEORDERED, C_CURRENCY_ID,
C_CONVERSIONTYPE_ID, PAYMENTRULE, C_PAYMENTTERM_ID, C_CHARGE_ID, M_PRICELIST_ID,
C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, ISPRINTED, ISDISCOUNTPRINTED,
ISPAID, ISINDISPUTE, ISPAYSCHEDULEVALID, C_INVOICEPAYSCHEDULE_ID, INVOICECOLLECTIONTYPE,
CHARGEAMT, TOTALLINES, GRANDTOTAL, MULTIPLIER, MULTIPLIERAP,
DOCBASETYPE)
AS
SELECT i.C_Invoice_ID, i.AD_Client_ID, i.AD_Org_ID, i.IsActive, i.Created, i.CreatedBy, i.Updated, i.UpdatedBy,
i.IsSOTrx, i.DocumentNo, i.DocStatus, i.DocAction, i.Processing, i.Processed, i.C_DocType_ID,
i.C_DocTypeTarget_ID, i.C_Order_ID, i.Description, i.IsApproved, i.IsTransferred,
i.SalesRep_ID, i.DateInvoiced, i.DatePrinted, i.DateAcct, i.C_BPartner_ID, i.C_BPartner_Location_ID,
i.AD_User_ID, i.POReference, i.DateOrdered, i.C_Currency_ID, i.C_ConversionType_ID, i.PaymentRule,
i.C_PaymentTerm_ID, i.C_Charge_ID, i.M_PriceList_ID, i.C_Campaign_ID, i.C_Project_ID,
i.C_Activity_ID, i.IsPrinted, i.IsDiscountPrinted, i.IsPaid, i.IsInDispute,
i.IsPayScheduleValid, null AS C_InvoicePaySchedule_ID, i.InvoiceCollectionType,
CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.ChargeAmt*-1 ELSE i.ChargeAmt END AS ChargeAmt,
CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.TotalLines*-1 ELSE i.TotalLines END AS TotalLines,
CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.GrandTotal*-1 ELSE i.GrandTotal END AS GrandTotal,
CASE WHEN charAt(d.DocBaseType,3)='C' THEN -1 ELSE 1 END AS Multiplier,
CASE WHEN charAt(d.DocBaseType,2)='P' THEN -1 ELSE 1 END AS MultiplierAP,
d.DocBaseType
FROM C_Invoice i
INNER JOIN C_DocType d ON (i.C_DocType_ID=d.C_DocType_ID)
WHERE i.IsPayScheduleValid<>'Y'
UNION
SELECT i.C_Invoice_ID, i.AD_Client_ID, i.AD_Org_ID, i.IsActive, i.Created, i.CreatedBy, i.Updated, i.UpdatedBy,
i.IsSOTrx, i.DocumentNo, i.DocStatus, i.DocAction, i.Processing, i.Processed, i.C_DocType_ID,
i.C_DocTypeTarget_ID, i.C_Order_ID, i.Description, i.IsApproved, i.IsTransferred,
i.SalesRep_ID, i.DateInvoiced, i.DatePrinted, i.DateAcct, i.C_BPartner_ID, i.C_BPartner_Location_ID,
i.AD_User_ID, i.POReference, i.DateOrdered, i.C_Currency_ID, i.C_ConversionType_ID, i.PaymentRule,
i.C_PaymentTerm_ID, i.C_Charge_ID, i.M_PriceList_ID, i.C_Campaign_ID, i.C_Project_ID,
i.C_Activity_ID, i.IsPrinted, i.IsDiscountPrinted, i.IsPaid, i.IsInDispute,
i.IsPayScheduleValid, ips.C_InvoicePaySchedule_ID, i.InvoiceCollectionType,
null AS ChargeAmt,
null AS TotalLines,
CASE WHEN charAt(d.DocBaseType,3)='C' THEN ips.DueAmt*-1 ELSE ips.DueAmt END AS GrandTotal,
CASE WHEN charAt(d.DocBaseType,3)='C' THEN -1 ELSE 1 END AS Multiplier,
CASE WHEN charAt(d.DocBaseType,2)='P' THEN -1 ELSE 1 END AS MultiplierAP,
d.DocBaseType
FROM C_Invoice i
INNER JOIN C_DocType d ON (i.C_DocType_ID=d.C_DocType_ID)
INNER JOIN C_InvoicePaySchedule ips ON (i.C_Invoice_ID=ips.C_Invoice_ID)
WHERE i.IsPayScheduleValid='Y'
AND ips.IsValid='Y';

View File

@ -0,0 +1,32 @@
CREATE OR REPLACE VIEW C_INVOICE_V1
(C_INVOICE_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
CREATEDBY, UPDATED, UPDATEDBY, ISSOTRX, DOCUMENTNO,
DOCSTATUS, DOCACTION, PROCESSING, PROCESSED, C_DOCTYPE_ID,
C_DOCTYPETARGET_ID, C_ORDER_ID, DESCRIPTION, ISAPPROVED, ISTRANSFERRED,
SALESREP_ID, DATEINVOICED, DATEPRINTED, DATEACCT, C_BPARTNER_ID,
C_BPARTNER_LOCATION_ID, AD_USER_ID, POREFERENCE, DATEORDERED, C_CURRENCY_ID,
C_CONVERSIONTYPE_ID, PAYMENTRULE, C_PAYMENTTERM_ID, C_CHARGE_ID, M_PRICELIST_ID,
C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, ISPRINTED, ISDISCOUNTPRINTED,
ISPAID, ISINDISPUTE, ISPAYSCHEDULEVALID, C_INVOICEPAYSCHEDULE_ID, INVOICECOLLECTIONTYPE,
CHARGEAMT, TOTALLINES, GRANDTOTAL, MULTIPLIER, MULTIPLIERAP,
DOCBASETYPE)
AS
SELECT i.C_Invoice_ID, i.AD_Client_ID, i.AD_Org_ID, i.IsActive, i.Created, i.CreatedBy, i.Updated, i.UpdatedBy,
i.IsSOTrx, i.DocumentNo, i.DocStatus, i.DocAction, i.Processing, i.Processed, i.C_DocType_ID,
i.C_DocTypeTarget_ID, i.C_Order_ID, i.Description, i.IsApproved, i.IsTransferred,
i.SalesRep_ID, i.DateInvoiced, i.DatePrinted, i.DateAcct, i.C_BPartner_ID, i.C_BPartner_Location_ID,
i.AD_User_ID, i.POReference, i.DateOrdered, i.C_Currency_ID, i.C_ConversionType_ID, i.PaymentRule,
i.C_PaymentTerm_ID, i.C_Charge_ID, i.M_PriceList_ID, i.C_Campaign_ID, i.C_Project_ID,
i.C_Activity_ID, i.IsPrinted, i.IsDiscountPrinted, i.IsPaid, i.IsInDispute,
i.IsPayScheduleValid, null AS C_InvoicePaySchedule_ID, i.InvoiceCollectionType,
CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.ChargeAmt*-1 ELSE i.ChargeAmt END AS ChargeAmt,
CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.TotalLines*-1 ELSE i.TotalLines END AS TotalLines,
CASE WHEN charAt(d.DocBaseType,3)='C' THEN i.GrandTotal*-1 ELSE i.GrandTotal END AS GrandTotal,
CASE WHEN charAt(d.DocBaseType,3)='C' THEN -1 ELSE 1 END AS Multiplier,
CASE WHEN charAt(d.DocBaseType,2)='P' THEN -1 ELSE 1 END AS MultiplierAP,
d.DocBaseType
FROM C_Invoice i
INNER JOIN C_DocType d ON (i.C_DocType_ID=d.C_DocType_ID);

View File

@ -0,0 +1,70 @@
CREATE OR REPLACE VIEW C_ORDER_HEADER_V
(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
UPDATED, UPDATEDBY, AD_LANGUAGE, C_ORDER_ID, ISSOTRX,
DOCUMENTNO, DOCSTATUS, C_DOCTYPE_ID, C_BPARTNER_ID, BPVALUE,
BPTAXID, NAICS, DUNS, ORG_LOCATION_ID, TAXID,
M_WAREHOUSE_ID, WAREHOUSE_LOCATION_ID, DOCUMENTTYPE, DOCUMENTTYPENOTE, SALESREP_ID,
SALESREP_NAME, DATEORDERED, DATEPROMISED, BPGREETING, NAME,
NAME2, BPCONTACTGREETING, TITLE, PHONE, CONTACTNAME,
C_LOCATION_ID, POSTAL, REFERENCENO, BILL_BPARTNER_ID, BILL_LOCATION_ID,
BILL_USER_ID, BILL_BPVALUE, BILL_BPTAXID, BILL_NAME, BILL_NAME2,
BILL_TITLE, BILL_PHONE, BILL_CONTACTNAME, BILL_C_LOCATION_ID, DESCRIPTION,
POREFERENCE, C_CURRENCY_ID, PAYMENTTERM, PAYMENTTERMNOTE, C_CHARGE_ID,
CHARGEAMT, TOTALLINES, GRANDTOTAL, AMTINWORDS, M_PRICELIST_ID,
ISTAXINCLUDED, VOLUME, WEIGHT, C_CAMPAIGN_ID, C_PROJECT_ID,
C_ACTIVITY_ID, M_SHIPPER_ID, DELIVERYRULE, DELIVERYVIARULE, PRIORITYRULE,
INVOICERULE)
AS
SELECT o.AD_Client_ID, o.AD_Org_ID, o.IsActive, o.Created, o.CreatedBy, o.Updated, o.UpdatedBy,
'en_US' AS AD_Language,
o.C_Order_ID, o.IsSOTrx, o.DocumentNo, o.DocStatus, o.C_DocType_ID,
o.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
o.M_Warehouse_ID, wh.C_Location_ID AS Warehouse_Location_ID,
dt.PrintName AS DocumentType, dt.DocumentNote AS DocumentTypeNote,
o.SalesRep_ID, COALESCE(ubp.Name, u.Name) AS SalesRep_Name,
o.DateOrdered, o.DatePromised,
bpg.Greeting AS BPGreeting,
bp.Name, bp.Name2,
bpcg.Greeting AS BPContactGreeting,
bpc.Title, bpc.Phone,
NULLIF (bpc.Name, bp.Name) AS ContactName,
bpl.C_Location_ID, l.Postal || l.Postal_Add AS Postal,
bp.ReferenceNo,
-- Bill to
o.Bill_BPartner_ID, o.Bill_Location_ID, o.Bill_User_ID,
bbp.Value AS Bill_BPValue, bbp.TaxID AS Bill_BPTaxID,
bbp.Name AS Bill_Name, bbp.Name2 AS Bill_Name2,
bbpc.Title AS Bill_Title, bbpc.Phone AS Bill_Phone,
NULLIF (bbpc.Name, bbp.Name) AS Bill_ContactName,
bbpl.C_Location_ID AS Bill_C_Location_ID,
o.Description,
o.POReference,
o.C_Currency_ID,
pt.Name AS PaymentTerm, pt.DocumentNote AS PaymentTermNote,
o.C_Charge_ID, o.ChargeAmt,
o.TotalLines,
o.GrandTotal, o.GrandTotal AS AmtInWords,
o.M_PriceList_ID,
o.IsTaxIncluded, o.Volume, o.Weight,
o.C_Campaign_ID, o.C_Project_ID, o.C_Activity_ID,
o.M_Shipper_ID, o.DeliveryRule, o.DeliveryViaRule, o.PriorityRule, o.InvoiceRule
FROM C_Order o
INNER JOIN C_DocType dt ON (o.C_DocType_ID=dt.C_DocType_ID)
INNER JOIN M_Warehouse wh ON (o.M_Warehouse_ID=wh.M_Warehouse_ID)
INNER JOIN C_PaymentTerm pt ON (o.C_PaymentTerm_ID=pt.C_PaymentTerm_ID)
INNER JOIN C_BPartner bp ON (o.C_BPartner_ID=bp.C_BPartner_ID)
LEFT OUTER JOIN C_Greeting bpg ON (bp.C_Greeting_ID=bpg.C_Greeting_ID)
INNER JOIN C_BPartner_Location bpl ON (o.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
INNER JOIN C_Location l ON (bpl.C_Location_ID=l.C_Location_ID)
LEFT OUTER JOIN AD_User bpc ON (o.AD_User_ID=bpc.AD_User_ID)
LEFT OUTER JOIN C_Greeting bpcg ON (bpc.C_Greeting_ID=bpcg.C_Greeting_ID)
INNER JOIN AD_OrgInfo oi ON (o.AD_Org_ID=oi.AD_Org_ID)
LEFT OUTER JOIN AD_User u ON (o.SalesRep_ID=u.AD_User_ID)
LEFT OUTER JOIN C_BPartner ubp ON (u.C_BPartner_ID=ubp.C_BPartner_ID)
INNER JOIN C_BPartner bbp ON (o.Bill_BPartner_ID=bbp.C_BPartner_ID)
INNER JOIN C_BPartner_Location bbpl ON (o.Bill_Location_ID=bbpl.C_BPartner_Location_ID)
LEFT OUTER JOIN AD_User bbpc ON (o.Bill_User_ID=bbpc.AD_User_ID);

View File

@ -0,0 +1,70 @@
CREATE OR REPLACE VIEW C_ORDER_HEADER_VT
(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
UPDATED, UPDATEDBY, AD_LANGUAGE, C_ORDER_ID, ISSOTRX,
DOCUMENTNO, DOCSTATUS, C_DOCTYPE_ID, C_BPARTNER_ID, BPVALUE,
BPTAXID, NAICS, DUNS, ORG_LOCATION_ID, TAXID,
M_WAREHOUSE_ID, WAREHOUSE_LOCATION_ID, DOCUMENTTYPE, DOCUMENTTYPENOTE, SALESREP_ID,
SALESREP_NAME, DATEORDERED, DATEPROMISED, BPGREETING, NAME,
NAME2, BPCONTACTGREETING, TITLE, PHONE, CONTACTNAME,
C_LOCATION_ID, POSTAL, REFERENCENO, BILL_BPARTNER_ID, BILL_LOCATION_ID,
BILL_USER_ID, BILL_BPVALUE, BILL_BPTAXID, BILL_NAME, BILL_NAME2,
BILL_TITLE, BILL_PHONE, BILL_CONTACTNAME, BILL_C_LOCATION_ID, DESCRIPTION,
POREFERENCE, C_CURRENCY_ID, PAYMENTTERM, PAYMENTTERMNOTE, C_CHARGE_ID,
CHARGEAMT, TOTALLINES, GRANDTOTAL, AMTINWORDS, M_PRICELIST_ID,
ISTAXINCLUDED, VOLUME, WEIGHT, C_CAMPAIGN_ID, C_PROJECT_ID,
C_ACTIVITY_ID, M_SHIPPER_ID, DELIVERYRULE, DELIVERYVIARULE, PRIORITYRULE,
INVOICERULE)
AS
SELECT o.AD_Client_ID, o.AD_Org_ID, o.IsActive, o.Created, o.CreatedBy, o.Updated, o.UpdatedBy,
dt.AD_Language,
o.C_Order_ID, o.IsSOTrx, o.DocumentNo, o.DocStatus, o.C_DocType_ID,
o.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
oi.C_Location_ID AS Org_Location_ID, oi.TaxID,
o.M_Warehouse_ID, wh.C_Location_ID AS Warehouse_Location_ID,
dt.PrintName AS DocumentType, dt.DocumentNote AS DocumentTypeNote,
o.SalesRep_ID, COALESCE(ubp.Name, u.Name) AS SalesRep_Name,
o.DateOrdered, o.DatePromised,
bpg.Greeting AS BPGreeting,
bp.Name, bp.Name2,
bpcg.Greeting AS BPContactGreeting,
bpc.Title, bpc.Phone,
NULLIF (bpc.Name, bp.Name) AS ContactName,
bpl.C_Location_ID, l.Postal || l.Postal_Add AS Postal,
bp.ReferenceNo,
-- Bill to
o.Bill_BPartner_ID, o.Bill_Location_ID, o.Bill_User_ID,
bbp.Value AS Bill_BPValue, bbp.TaxID AS Bill_BPTaxID,
bbp.Name AS Bill_Name, bbp.Name2 AS Bill_Name2,
bbpc.Title AS Bill_Title, bbpc.Phone AS Bill_Phone,
NULLIF (bbpc.Name, bbp.Name) AS Bill_ContactName,
bbpl.C_Location_ID AS Bill_C_Location_ID,
o.Description,
o.POReference,
o.C_Currency_ID,
pt.Name AS PaymentTerm, pt.DocumentNote AS PaymentTermNote,
o.C_Charge_ID, o.ChargeAmt,
o.TotalLines,
o.GrandTotal, o.GrandTotal AS AmtInWords,
o.M_PriceList_ID,
o.IsTaxIncluded, o.Volume, o.Weight,
o.C_Campaign_ID, o.C_Project_ID, o.C_Activity_ID,
o.M_Shipper_ID, o.DeliveryRule, o.DeliveryViaRule, o.PriorityRule, o.InvoiceRule
FROM C_Order o
INNER JOIN C_DocType_Trl dt ON (o.C_DocType_ID=dt.C_DocType_ID)
INNER JOIN M_Warehouse wh ON (o.M_Warehouse_ID=wh.M_Warehouse_ID)
INNER JOIN C_PaymentTerm_Trl pt ON (o.C_PaymentTerm_ID=pt.C_PaymentTerm_ID AND dt.AD_Language=pt.AD_Language)
INNER JOIN C_BPartner bp ON (o.C_BPartner_ID=bp.C_BPartner_ID)
LEFT OUTER JOIN C_Greeting_Trl bpg ON (bp.C_Greeting_ID=bpg.C_Greeting_ID AND dt.AD_Language=bpg.AD_Language)
INNER JOIN C_BPartner_Location bpl ON (o.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
INNER JOIN C_Location l ON (bpl.C_Location_ID=l.C_Location_ID)
LEFT OUTER JOIN AD_User bpc ON (o.AD_User_ID=bpc.AD_User_ID)
LEFT OUTER JOIN C_Greeting_Trl bpcg ON (bpc.C_Greeting_ID=bpcg.C_Greeting_ID AND dt.AD_Language=bpcg.AD_Language)
INNER JOIN AD_OrgInfo oi ON (o.AD_Org_ID=oi.AD_Org_ID)
LEFT OUTER JOIN AD_User u ON (o.SalesRep_ID=u.AD_User_ID)
LEFT OUTER JOIN C_BPartner ubp ON (u.C_BPartner_ID=ubp.C_BPartner_ID)
INNER JOIN C_BPartner bbp ON (o.Bill_BPartner_ID=bbp.C_BPartner_ID)
INNER JOIN C_BPartner_Location bbpl ON (o.Bill_Location_ID=bbpl.C_BPartner_Location_ID)
LEFT OUTER JOIN AD_User bbpc ON (o.Bill_User_ID=bbpc.AD_User_ID);

View File

@ -0,0 +1,93 @@
CREATE OR REPLACE VIEW C_ORDER_LINETAX_V
(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
UPDATED, UPDATEDBY, AD_LANGUAGE, C_ORDER_ID, C_ORDERLINE_ID,
C_TAX_ID, TAXINDICATOR, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID, BPNAME,
C_LOCATION_ID, LINE, M_PRODUCT_ID, QTYORDERED, QTYENTERED,
UOMSYMBOL, NAME, DESCRIPTION, DOCUMENTNOTE, UPC,
SKU, PRODUCTVALUE, RESOURCEDESCRIPTION, PRICELIST, PRICEENTEREDLIST,
DISCOUNT, PRICEACTUAL, PRICEENTERED, LINENETAMT, PRODUCTDESCRIPTION,
IMAGEURL, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, C_PROJECTPHASE_ID,
C_PROJECTTASK_ID)
AS
SELECT ol.AD_Client_ID, ol.AD_Org_ID, ol.IsActive, ol.Created, ol.CreatedBy, ol.Updated, ol.UpdatedBy,
'en_US' AS AD_Language,
ol.C_Order_ID, ol.C_OrderLine_ID, ol.C_Tax_ID, t.TaxIndicator,
ol.C_BPartner_ID, ol.C_BPartner_Location_ID, bp.Name AS BPName, bpl.C_Location_ID,
ol.Line, p.M_Product_ID,
CASE WHEN ol.QtyOrdered<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.QtyOrdered END AS QtyOrdered,
CASE WHEN ol.QtyEntered<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.QtyEntered END AS QtyEntered,
CASE WHEN ol.QtyEntered<>0 OR ol.M_Product_ID IS NOT NULL THEN uom.UOMSymbol END AS UOMSymbol,
COALESCE(c.Name,p.Name||productAttribute(ol.M_AttributeSetInstance_ID), ol.Description) AS Name, -- main line
CASE WHEN COALESCE(c.Name,p.Name) IS NOT NULL THEN ol.Description END AS Description, -- second line
p.DocumentNote, -- third line
p.UPC, p.SKU, COALESCE(pp.VendorProductNo,p.Value) AS ProductValue,
ra.Description AS ResourceDescription, -- forth line
CASE WHEN i.IsDiscountPrinted='Y' AND ol.PriceList<>0
THEN ol.PriceList END AS PriceList,
CASE WHEN i.IsDiscountPrinted='Y' AND ol.PriceList<>0 AND ol.QtyEntered<>0
THEN ol.PriceList*ol.QtyOrdered/ol.QtyEntered END AS PriceEnteredList,
CASE WHEN i.IsDiscountPrinted='Y' AND ol.PriceList>ol.PriceActual AND ol.PriceList<>0
THEN (ol.PriceList-ol.PriceActual)/ol.PriceList*100 END AS Discount,
CASE WHEN ol.PriceActual<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.PriceActual END AS PriceActual,
CASE WHEN ol.PriceEntered<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.PriceEntered END AS PriceEntered,
CASE WHEN ol.LineNetAmt<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.LineNetAmt END AS LineNetAmt,
p.Description as ProductDescription, p.ImageURL,
ol.C_Campaign_ID, ol.C_Project_ID, ol.C_Activity_ID, ol.C_ProjectPhase_ID, ol.C_ProjectTask_ID
FROM C_OrderLine ol
INNER JOIN C_UOM uom ON (ol.C_UOM_ID=uom.C_UOM_ID)
INNER JOIN C_Order i ON (ol.C_Order_ID=i.C_Order_ID)
LEFT OUTER JOIN M_Product p ON (ol.M_Product_ID=p.M_Product_ID)
LEFT OUTER JOIN S_ResourceAssignment ra ON (ol.S_ResourceAssignment_ID=ra.S_ResourceAssignment_ID)
LEFT OUTER JOIN C_Charge c ON (ol.C_Charge_ID=c.C_Charge_ID)
LEFT OUTER JOIN C_BPartner_Product pp ON (ol.M_Product_ID=pp.M_Product_ID AND i.C_BPartner_ID=pp.C_BPartner_ID)
INNER JOIN C_BPartner bp ON (ol.C_BPartner_ID=bp.C_BPartner_ID)
INNER JOIN C_BPartner_Location bpl ON (ol.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
LEFT OUTER JOIN C_Tax t ON (ol.C_Tax_ID=t.C_Tax_ID)
UNION
SELECT ol.AD_Client_ID, ol.AD_Org_ID, ol.IsActive, ol.Created, ol.CreatedBy, ol.Updated, ol.UpdatedBy,
'en_US' AS AD_Language,
ol.C_Order_ID, ol.C_OrderLine_ID, ol.C_Tax_ID, null,
null, null, null, null,
ol.Line+(b.Line/100) AS Line, p.M_Product_ID,
ol.QtyOrdered*b.BOMQty AS QtyInvoiced, ol.QtyEntered*b.BOMQty AS QtyEntered, uom.UOMSymbol,
p.Name, -- main
b.Description,
p.DocumentNote, p.UPC, p.SKU, p.Value AS ProductValue,
null, null, null, null, null, null, null, p.Description as ProductDescription, p.ImageURL,
ol.C_Campaign_ID, ol.C_Project_ID, ol.C_Activity_ID, ol.C_ProjectPhase_ID, ol.C_ProjectTask_ID
FROM M_Product_BOM b -- BOM lines
INNER JOIN C_OrderLine ol ON (b.M_Product_ID=ol.M_Product_ID)
INNER JOIN M_Product bp ON (bp.M_Product_ID=ol.M_Product_ID -- BOM Product
AND bp.IsBOM='Y' AND bp.IsVerified='Y' AND bp.IsInvoicePrintDetails='Y')
INNER JOIN M_Product p ON (b.M_ProductBOM_ID=p.M_Product_ID) -- BOM line product
INNER JOIN C_UOM uom ON (p.C_UOM_ID=uom.C_UOM_ID)
UNION
SELECT AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
'en_US', C_Order_ID, null, null, null,
null,
null, null, null,
null, null, null, null,
null, null,
null, null, null, null, null, null,
null, null, null, null, null, null, null, null,
null,null,null,null,null
FROM C_Order
UNION
SELECT ot.AD_Client_ID, ot.AD_Org_ID, ot.IsActive, ot.Created, ot.CreatedBy, ot.Updated, ot.UpdatedBy,
'en_US', ot.C_Order_ID, null, ot.C_Tax_ID, t.TaxIndicator,
null, null, null, null,
null, null,
null, null, null,
t.Name,
null, null, null, null, null, null,
null, null, null,
CASE WHEN ot.IsTaxIncluded='Y' THEN ot.TaxAmt ELSE ot.TaxBaseAmt END,
CASE WHEN ot.IsTaxIncluded='Y' THEN ot.TaxAmt ELSE ot.TaxBaseAmt END,
CASE WHEN ot.IsTaxIncluded='Y' THEN NULL ELSE ot.TaxAmt END,
null, null,
null,null,null,null,null
FROM C_OrderTax ot
INNER JOIN C_Tax t ON (ot.C_Tax_ID=t.C_Tax_ID);

View File

@ -0,0 +1,96 @@
CREATE OR REPLACE VIEW C_ORDER_LINETAX_VT
(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
UPDATED, UPDATEDBY, AD_LANGUAGE, C_ORDER_ID, C_ORDERLINE_ID,
C_TAX_ID, TAXINDICATOR, C_BPARTNER_ID, C_BPARTNER_LOCATION_ID, BPNAME,
C_LOCATION_ID, LINE, M_PRODUCT_ID, QTYORDERED, QTYENTERED,
UOMSYMBOL, NAME, DESCRIPTION, DOCUMENTNOTE, UPC,
SKU, PRODUCTVALUE, RESOURCEDESCRIPTION, PRICELIST, PRICEENTEREDLIST,
DISCOUNT, PRICEACTUAL, PRICEENTERED, LINENETAMT, PRODUCTDESCRIPTION,
IMAGEURL, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID, C_PROJECTPHASE_ID,
C_PROJECTTASK_ID)
AS
SELECT ol.AD_Client_ID, ol.AD_Org_ID, ol.IsActive, ol.Created, ol.CreatedBy, ol.Updated, ol.UpdatedBy,
uom.AD_Language,
ol.C_Order_ID, ol.C_OrderLine_ID, ol.C_Tax_ID, t.TaxIndicator,
ol.C_BPartner_ID, ol.C_BPartner_Location_ID, bp.Name AS BPName, bpl.C_Location_ID,
ol.Line, p.M_Product_ID,
CASE WHEN ol.QtyOrdered<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.QtyOrdered END AS QtyOrdered,
CASE WHEN ol.QtyEntered<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.QtyEntered END AS QtyEntered,
CASE WHEN ol.QtyEntered<>0 OR ol.M_Product_ID IS NOT NULL THEN uom.UOMSymbol END AS UOMSymbol,
COALESCE(c.Name,p.Name||productAttribute(ol.M_AttributeSetInstance_ID), ol.Description) AS Name, -- main line
CASE WHEN COALESCE(c.Name,pt.Name, p.Name) IS NOT NULL THEN ol.Description END AS Description, -- second line
COALESCE(pt.DocumentNote, p.DocumentNote) AS DocumentNote, -- third line
p.UPC, p.SKU, COALESCE(pp.VendorProductNo,p.Value) AS ProductValue,
ra.Description AS ResourceDescription, -- forth line
CASE WHEN i.IsDiscountPrinted='Y' AND ol.PriceList<>0
THEN ol.PriceList END AS PriceList,
CASE WHEN i.IsDiscountPrinted='Y' AND ol.PriceList<>0 AND ol.QtyEntered<>0
THEN ol.PriceList*ol.QtyOrdered/ol.QtyEntered END AS PriceEnteredList,
CASE WHEN i.IsDiscountPrinted='Y' AND ol.PriceList>ol.PriceActual AND ol.PriceList<>0
THEN (ol.PriceList-ol.PriceActual)/ol.PriceList*100 END AS Discount,
CASE WHEN ol.PriceActual<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.PriceActual END AS PriceActual,
CASE WHEN ol.PriceEntered<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.PriceEntered END AS PriceEntered,
CASE WHEN ol.LineNetAmt<>0 OR ol.M_Product_ID IS NOT NULL THEN ol.LineNetAmt END AS LineNetAmt,
pt.Description as ProductDescription, p.ImageURL,
ol.C_Campaign_ID, ol.C_Project_ID, ol.C_Activity_ID, ol.C_ProjectPhase_ID, ol.C_ProjectTask_ID
FROM C_OrderLine ol
INNER JOIN C_UOM_Trl uom ON (ol.C_UOM_ID=uom.C_UOM_ID)
INNER JOIN C_Order i ON (ol.C_Order_ID=i.C_Order_ID)
LEFT OUTER JOIN M_Product p ON (ol.M_Product_ID=p.M_Product_ID)
LEFT OUTER JOIN M_Product_Trl pt ON (ol.M_Product_ID=pt.M_Product_ID AND uom.AD_Language=pt.AD_Language)
LEFT OUTER JOIN S_ResourceAssignment ra ON (ol.S_ResourceAssignment_ID=ra.S_ResourceAssignment_ID)
LEFT OUTER JOIN C_Charge c ON (ol.C_Charge_ID=c.C_Charge_ID)
LEFT OUTER JOIN C_BPartner_Product pp ON (ol.M_Product_ID=pp.M_Product_ID AND i.C_BPartner_ID=pp.C_BPartner_ID)
INNER JOIN C_BPartner bp ON (ol.C_BPartner_ID=bp.C_BPartner_ID)
INNER JOIN C_BPartner_Location bpl ON (ol.C_BPartner_Location_ID=bpl.C_BPartner_Location_ID)
LEFT OUTER JOIN C_Tax_Trl t ON (ol.C_Tax_ID=t.C_Tax_ID AND uom.AD_Language=t.AD_Language)
UNION
SELECT ol.AD_Client_ID, ol.AD_Org_ID, ol.IsActive, ol.Created, ol.CreatedBy, ol.Updated, ol.UpdatedBy,
uom.AD_Language,
ol.C_Order_ID, ol.C_OrderLine_ID, ol.C_Tax_ID, null,
null, null, null, null,
ol.Line+(b.Line/100) AS Line, p.M_Product_ID,
ol.QtyOrdered*b.BOMQty AS QtyInvoiced, ol.QtyEntered*b.BOMQty AS QtyEntered, uom.UOMSymbol,
COALESCE(pt.Name, p.Name) AS Name, -- main
b.Description,
COALESCE(pt.DocumentNote, p.DocumentNote) AS DocumentNote, p.UPC, p.SKU, p.Value AS ProductValue,
null, null, null, null, null, null, null, pt.Description AS ProductDescription, p.ImageURL,
ol.C_Campaign_ID, ol.C_Project_ID, ol.C_Activity_ID, ol.C_ProjectPhase_ID, ol.C_ProjectTask_ID
FROM M_Product_BOM b -- BOM lines
INNER JOIN C_OrderLine ol ON (b.M_Product_ID=ol.M_Product_ID)
INNER JOIN M_Product bp ON (bp.M_Product_ID=ol.M_Product_ID -- BOM Product
AND bp.IsBOM='Y' AND bp.IsVerified='Y' AND bp.IsInvoicePrintDetails='Y')
INNER JOIN M_Product p ON (b.M_ProductBOM_ID=p.M_Product_ID) -- BOM line product
INNER JOIN C_UOM_Trl uom ON (p.C_UOM_ID=uom.C_UOM_ID)
INNER JOIN M_Product_Trl pt ON (b.M_ProductBOM_ID=pt.M_Product_ID AND uom.AD_Language=pt.AD_Language)
UNION
SELECT o.AD_Client_ID, o.AD_Org_ID, o.IsActive, o.Created, o.CreatedBy, o.Updated, o.UpdatedBy,
l.AD_Language, o.C_Order_ID, null, null, null,
null,
null, null, null,
null, null, null, null,
null, null,
null, null, null, null, null, null,
null, null, null, null, null, null, null, null,
null,null,null,null,null
FROM C_Order o, AD_Language l
WHERE l.IsBaseLanguage='N' AND l.IsSystemLanguage='Y'
UNION
SELECT ot.AD_Client_ID, ot.AD_Org_ID, ot.IsActive, ot.Created, ot.CreatedBy, ot.Updated, ot.UpdatedBy,
t.AD_Language, ot.C_Order_ID, null, ot.C_Tax_ID, t.TaxIndicator,
null, null, null, null,
null, null,
null, null, null,
t.Name,
null, null, null, null, null, null,
null, null, null,
CASE WHEN ot.IsTaxIncluded='Y' THEN ot.TaxAmt ELSE ot.TaxBaseAmt END,
CASE WHEN ot.IsTaxIncluded='Y' THEN ot.TaxAmt ELSE ot.TaxBaseAmt END,
CASE WHEN ot.IsTaxIncluded='Y' THEN NULL ELSE ot.TaxAmt END,
null, null,
null,null,null,null,null
FROM C_OrderTax ot
INNER JOIN C_Tax_Trl t ON (ot.C_Tax_ID=t.C_Tax_ID);

View File

@ -0,0 +1,42 @@
CREATE OR REPLACE VIEW C_PAYMENT_V
(C_PAYMENT_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED,
CREATEDBY, UPDATED, UPDATEDBY, DOCUMENTNO, DATETRX,
ISRECEIPT, C_DOCTYPE_ID, TRXTYPE, C_BANKACCOUNT_ID, C_BPARTNER_ID,
C_INVOICE_ID, C_BP_BANKACCOUNT_ID, C_PAYMENTBATCH_ID, TENDERTYPE, CREDITCARDTYPE,
CREDITCARDNUMBER, CREDITCARDVV, CREDITCARDEXPMM, CREDITCARDEXPYY, MICR,
ROUTINGNO, ACCOUNTNO, CHECKNO, A_NAME, A_STREET,
A_CITY, A_STATE, A_ZIP, A_IDENT_DL, A_IDENT_SSN,
A_EMAIL, VOICEAUTHCODE, ORIG_TRXID, PONUM, C_CURRENCY_ID,
C_CONVERSIONTYPE_ID, PAYAMT, DISCOUNTAMT, WRITEOFFAMT, TAXAMT,
OVERUNDERAMT, MULTIPLIERAP, ISOVERUNDERPAYMENT, ISAPPROVED, R_PNREF,
R_RESULT, R_RESPMSG, R_AUTHCODE, R_AVSADDR, R_AVSZIP,
R_INFO, PROCESSING, OPROCESSING, DOCSTATUS, DOCACTION,
ISPREPAYMENT, C_CHARGE_ID, ISRECONCILED, ISALLOCATED, ISONLINE,
PROCESSED, POSTED, C_CAMPAIGN_ID, C_PROJECT_ID, C_ACTIVITY_ID)
AS
SELECT C_Payment_ID, AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,
DocumentNo, DateTrx, IsReceipt, C_DocType_ID, TrxType,
C_BankAccount_ID, C_BPartner_ID, C_Invoice_ID, C_BP_BankAccount_ID, C_PaymentBatch_ID,
TenderType, CreditCardType, CreditCardNumber, CreditCardVV, CreditCardExpMM, CreditCardExpYY,
Micr, RoutingNo, AccountNo, CheckNo,
A_Name, A_Street, A_City, A_State, A_Zip, A_Ident_DL, A_Ident_SSN, A_EMail,
VoiceAuthCode, Orig_TrxID, PONum,
C_Currency_ID, C_ConversionType_ID,
CASE IsReceipt WHEN 'Y' THEN PayAmt ELSE PayAmt*-1 END AS PayAmt,
CASE IsReceipt WHEN 'Y' THEN DiscountAmt ELSE DiscountAmt*-1 END AS DiscountAmt,
CASE IsReceipt WHEN 'Y' THEN WriteOffAmt ELSE WriteOffAmt*-1 END AS WriteOffAmt,
CASE IsReceipt WHEN 'Y' THEN TaxAmt ELSE TaxAmt*-1 END AS TaxAmt,
CASE IsReceipt WHEN 'Y' THEN OverUnderAmt ELSE OverUnderAmt*-1 END AS OverUnderAmt,
CASE IsReceipt WHEN 'Y' THEN 1 ELSE -1 END AS MultiplierAP,
IsOverUnderPayment, IsApproved,
R_PnRef, R_Result, R_RespMsg, R_AuthCode, R_AvsAddr, R_AvsZip, R_Info,
Processing, OProcessing, DocStatus, DocAction,
IsPrepayment, C_Charge_ID,
IsReconciled, IsAllocated, IsOnline, Processed, Posted,
C_Campaign_ID, C_Project_ID, C_Activity_ID
FROM C_Payment;
--COMMENT ON TABLE C_PAYMENT_V IS 'Payment Information corrected for AP/AR';

View File

@ -0,0 +1,27 @@
CREATE OR REPLACE VIEW C_PAYSELECTION_CHECK_V
(AD_CLIENT_ID, AD_ORG_ID, AD_LANGUAGE, C_PAYSELECTION_ID, C_PAYSELECTIONCHECK_ID,
ORG_LOCATION_ID, TAXID, C_DOCTYPE_ID, C_BPARTNER_ID, BPVALUE,
BPTAXID, NAICS, DUNS, BPGREETING, NAME,
NAME2, C_LOCATION_ID, REFERENCENO, POREFERENCE, PAYDATE,
PAYAMT, AMTINWORDS, QTY, PAYMENTRULE, DOCUMENTNO)
AS
SELECT psc.AD_Client_ID, psc.AD_Org_ID,
'en_US' AS AD_Language,
psc.C_PaySelection_ID, psc.C_PaySelectionCheck_ID,
oi.C_Location_ID AS Org_Location_ID, oi.TaxID, 0 AS C_DocType_ID,
bp.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
bpg.Greeting AS BPGreeting,
bp.Name, bp.Name2,
bpartnerRemitLocation(bp.C_BPartner_ID) AS C_Location_ID,
bp.ReferenceNo, bp.POReference,
ps.PayDate,
psc.PayAmt, psc.PayAmt AS AmtInWords,
psc.Qty, psc.PaymentRule, psc.DocumentNo
FROM C_PaySelectionCheck psc
INNER JOIN C_PaySelection ps ON (psc.C_PaySelection_ID=ps.C_PaySelection_ID)
INNER JOIN C_BPartner bp ON (psc.C_BPartner_ID=bp.C_BPartner_ID)
LEFT OUTER JOIN C_Greeting bpg on (bp.C_Greeting_ID=bpg.C_Greeting_ID)
INNER JOIN AD_OrgInfo oi ON (psc.AD_Org_ID=oi.AD_Org_ID);

View File

@ -0,0 +1,28 @@
CREATE OR REPLACE VIEW C_PAYSELECTION_CHECK_VT
(AD_CLIENT_ID, AD_ORG_ID, AD_LANGUAGE, C_PAYSELECTION_ID, C_PAYSELECTIONCHECK_ID,
ORG_LOCATION_ID, TAXID, C_DOCTYPE_ID, C_BPARTNER_ID, BPVALUE,
BPTAXID, NAICS, DUNS, BPGREETING, NAME,
NAME2, C_LOCATION_ID, REFERENCENO, POREFERENCE, PAYDATE,
PAYAMT, AMTINWORDS, QTY, PAYMENTRULE, DOCUMENTNO)
AS
SELECT psc.AD_Client_ID, psc.AD_Org_ID,
l.AD_Language,
psc.C_PaySelection_ID, psc.C_PaySelectionCheck_ID,
oi.C_Location_ID AS Org_Location_ID, oi.TaxID, 0 AS C_DocType_ID,
bp.C_BPartner_ID, bp.Value AS BPValue, bp.TaxID AS BPTaxID, bp.NAICS, bp.DUNS,
bpg.Greeting AS BPGreeting,
bp.Name, bp.Name2,
bpartnerRemitLocation(bp.C_BPartner_ID) AS C_Location_ID,
bp.ReferenceNo, bp.POReference,
ps.PayDate,
psc.PayAmt, psc.PayAmt AS AmtInWords,
psc.Qty, psc.PaymentRule, psc.DocumentNo
FROM C_PaySelectionCheck psc
INNER JOIN C_PaySelection ps ON (psc.C_PaySelection_ID=ps.C_PaySelection_ID)
INNER JOIN C_BPartner bp ON (psc.C_BPartner_ID=bp.C_BPartner_ID)
INNER JOIN AD_OrgInfo oi ON (psc.AD_Org_ID=oi.AD_Org_ID)
LEFT OUTER JOIN AD_Language l ON (l.IsSystemLanguage='Y')
LEFT OUTER JOIN C_Greeting_Trl bpg on (bp.C_Greeting_ID=bpg.C_Greeting_ID AND bpg.AD_Language=l.AD_Language);

View File

@ -0,0 +1,17 @@
CREATE OR REPLACE VIEW C_PAYSELECTION_REMITTANCE_V
(AD_CLIENT_ID, AD_ORG_ID, AD_LANGUAGE, C_PAYSELECTION_ID, C_PAYSELECTIONLINE_ID,
C_PAYSELECTIONCHECK_ID, PAYMENTRULE, LINE, OPENAMT, PAYAMT,
DISCOUNTAMT, DIFFERENCEAMT, C_BPARTNER_ID, DOCUMENTNO, DATEINVOICED,
GRANDTOTAL, AMTINWORDS)
AS
SELECT psl.AD_Client_ID, psl.AD_Org_ID,
'en_US' AS AD_Language,
psl.C_PaySelection_ID, psl.C_PaySelectionLine_ID,
psl.C_PaySelectionCheck_ID,
psl.PaymentRule, psl.Line, psl.OpenAmt, psl.PayAmt, psl.DiscountAmt, psl.DifferenceAmt,
i.C_BPartner_ID, i.DocumentNo, i.DateInvoiced, i.GrandTotal, i.GrandTotal AS AmtInWords
FROM C_PaySelectionLine psl
INNER JOIN C_Invoice i ON (psl.C_Invoice_ID=i.C_Invoice_ID);

View File

@ -0,0 +1,18 @@
CREATE OR REPLACE VIEW C_PAYSELECTION_REMITTANCE_VT
(AD_CLIENT_ID, AD_ORG_ID, AD_LANGUAGE, C_PAYSELECTION_ID, C_PAYSELECTIONLINE_ID,
C_PAYSELECTIONCHECK_ID, PAYMENTRULE, LINE, OPENAMT, PAYAMT,
DISCOUNTAMT, DIFFERENCEAMT, C_BPARTNER_ID, DOCUMENTNO, DATEINVOICED,
GRANDTOTAL, AMTINWORDS)
AS
SELECT psl.AD_Client_ID, psl.AD_Org_ID,
l.AD_Language,
psl.C_PaySelection_ID, psl.C_PaySelectionLine_ID,
psl.C_PaySelectionCheck_ID,
psl.PaymentRule, psl.Line, psl.OpenAmt, psl.PayAmt, psl.DiscountAmt, psl.DifferenceAmt,
i.C_BPartner_ID, i.DocumentNo, i.DateInvoiced, i.GrandTotal, i.GrandTotal AS AmtInWords
FROM C_PaySelectionLine psl
INNER JOIN C_Invoice i ON (psl.C_Invoice_ID=i.C_Invoice_ID)
INNER JOIN AD_Language l ON (l.IsSystemLanguage='Y');

View File

@ -0,0 +1,28 @@
CREATE OR REPLACE VIEW C_PROJECT_DETAILS_V
(AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
UPDATED, UPDATEDBY, AD_LANGUAGE, C_PROJECT_ID, C_PROJECTLINE_ID,
LINE, PLANNEDQTY, PLANNEDPRICE, PLANNEDAMT, PLANNEDMARGINAMT,
COMMITTEDAMT, M_PRODUCT_ID, NAME, DESCRIPTION, DOCUMENTNOTE,
UPC, SKU, PRODUCTVALUE, M_PRODUCT_CATEGORY_ID, INVOICEDAMT,
INVOICEDQTY, COMMITTEDQTY)
AS
SELECT pl.AD_Client_ID, pl.AD_Org_ID, pl.IsActive, pl.Created, pl.CreatedBy, pl.Updated, pl.UpdatedBy,
'en_US' AS AD_Language,
pj.C_Project_ID, pl.C_ProjectLine_ID,
pl.Line,
pl.PlannedQty, pl.PlannedPrice, pl.PlannedAmt, pl.PlannedMarginAmt,
pl.CommittedAmt,
pl.M_Product_ID,
COALESCE(p.Name, pl.Description) AS Name, -- main line
CASE WHEN p.Name IS NOT NULL THEN pl.Description END AS Description, -- second line
p.DocumentNote, -- third line
p.UPC, p.SKU, p.Value AS ProductValue,
pl.M_Product_Category_ID,
pl.InvoicedAmt, pl.InvoicedQty, pl.CommittedQty
FROM C_ProjectLine pl
INNER JOIN C_Project pj ON (pl.C_Project_ID=pj.C_Project_ID)
LEFT OUTER JOIN M_Product p ON (pl.M_Product_ID=p.M_Product_ID)
WHERE pl.IsPrinted='Y';

Some files were not shown because too many files have changed in this diff Show More