// #####################################################################################
//
//  d.link for Microsoft Dynamics Nav 3.0
//
//  Raber+Märcker GmbH - 5.3.10
//
// #####################################################################################

global vars h_NavOdbcSource
h_NavOdbcSource = "ERP"

// doc-dat-field numbers
global vars h_DDF_SQUOTENO     = 22  // sales quote number
global vars h_DDF_SORDERNO     = 2  // sales order numbers
global vars h_DDF_BARCODE = 6
global vars h_DDF_DTTEMP = 47
global vars h_DDF_COMPANY = 0

// document types for folder links
global vars h_DT_SOCONF    = "dakb"  // order confirmation

global vars h_EditUser = "RM"

global vars h_UpdateAttributes = 1

vars h_ARRAY_MAX = 100		

// #####################################################################################
// hook_insert_entry_10_ass
// #####################################################################################

proc hook_insert_entry_05_ass(h_User, h_DocType)
{
	if ( h_DocType == "dkoak" )
	{
		vars ergebnis
		ergebnis			= api_function( "string_split", dok_dat_feld[ 32 ], "--" )
		dok_dat_feld[ 32 ]	= api_splitted_string[ 1 ]
		
		zeich_nr			= dok_dat_feld[ 32 ]
		
		call xlog( 5, "zeich_nr " ## zeich_nr )
		call xlog( 5, "dok_dat_feld_32 " ## dok_dat_feld[ 32 ] )
	}
}
	
proc hook_insert_entry_10_ass(h_User, h_DocType)
{
	vars lReturnValue
	
	lReturnValue = InsertEntry10( h_User, h_DocType )
	
	if( lReturnValue != 0 )
    {
       return lReturnValue
    }
	// eingefügt von calb/d.OS am 2012.11.08
	vars vorhandene_doku_id, vorhandenes_datum, anzahl_treffer, kampagne, v_dok_dat_feld_51
	
	if ( h_DocType == "ddab" )
	{
		
		// Feststellen, ob das Dokument bereits im System vorhanden ist
		dbms alias vorhandene_doku_id, v_dok_dat_feld_51
		dbms sql select doku_id, dok_dat_feld_51 from firmen_spezifisch where dok_dat_feld_2 = :+dok_dat_feld[2] and kue_dokuart = 'ddab'
		
		anzahl_treffer = @dmrowcount
		dbms alias
		
		if ( anzahl_treffer == 0 )
		{
			// Das Dokument existiert noch nicht im System
			call xlog( 4, "Das Dokument mit der Nummer :dok_dat_feld[2] existiert noch nicht im System. " )
			
			dbms declare ta_session connection for user 'Master' password 'geheim' datasource 'D3P'
			
			dbms with connection ta_session alias vorhandenes_datum, kampagne
			dbms with connection ta_session sql select beleg_dat, kampagne from as_ab_import where auftrags_nr = :+dok_dat_feld[2]
			anzahl_treffer = @dmrowcount
			dbms with connection ta_session alias
			
			
			
			call xlog( 5, "Anzahl Treffer: <:anzahl_treffer> neues Datum: <:vorhandenes_datum> Kampagne: <:kampagne> Auftrags-Nr. <:dok_dat_feld[2]> " )
			
			dok_dat_feld[51]		= vorhandenes_datum
			dok_dat_feld_60[1]		= kampagne
			
		}
		else if ( anzahl_treffer > 0 )
		{
			// Das Dokument existiert schon im System
			call xlog( 3, "Das Dokument mit der Nummer :dok_dat_feld[2] existiert bereits im System mit der Doku-ID <:vorhandene_doku_id> und dem Beleg-Datum <:v_dok_dat_feld_51>. " )
			dbms declare ta_session connection for user 'Master' password 'geheim' datasource 'D3P'
			
			dbms with connection ta_session alias vorhandenes_datum, kampagne
			dbms with connection ta_session sql select beleg_dat, kampagne from as_ab_import where auftrags_nr = :+dok_dat_feld[2] and beleg_dat > v_dok_dat_feld_51
			anzahl_treffer = @dmrowcount
			dbms with connection ta_session alias
			
			if ( anzahl_treffer > 0 )
			{
				// Es wurde ein entsprechender Datensatz gefunden
				dok_dat_feld[51]		= vorhandenes_datum
				dok_dat_feld_60[1]		= kampagne
				call xlog( 5, "Anzahl Treffer: <:anzahl_treffer> neues Datum: <:vorhandenes_datum> Kampagne: <:kampagne> Auftrags-Nr. <:dok_dat_feld[2]> " )
			}
			else if ( anzahl_treffer == 0 )
			{
				// Es wurde keiner gefunden
				// Dokument wird abgelehnt
				call xlog( 2, "1 Es ist ein Fehler aufgetreten: :anzahl_treffer " )
				return -202
			}
			else
			{
				// Es ist ein Fehler aufgetreten
				call xlog( 2, "2 Es ist ein Fehler aufgetreten: :anzahl_treffer " )
				return -203
			}
			
		}
		else
		{
			// Es ist ein Fehler aufgetreten
			call xlog( 2, "3 Es ist ein Fehler aufgetreten: :anzahl_treffer " )
			return -201
		}
		
	}
	// Ende Einfügung calb/d.OS am 2012.11.08
	
	// eingefügt von calb/d.OS am 2013.02.04
	// Import von Konstruktionszeichnungen aus IMOS
	vars bauteilart, materialart, orientierung, programm, ppsnummer, barcode, anzahl_treffer, info1, info2, info3, info4, anschlag, ergebnis
	
	if ( h_DocType == "dkoak" )
	{
		// Setzen der zeich_nr und Aufsplitten des Barcodes in insert_entry_05 ausgelagert
		// calb/d.velop AG
		
		// dbms declare ta_session connection for user 'ASSMANN\\DB-connect-IMOS-D3' password 'QK+NE}qj=)q=' datasource 'IMOS-DB-Prod'
		dbms declare ta_session connection for user 'sa' password 'aPFb4eNyZT57T' datasource 'IMOS-DB'
		
		// orientierung ANSCHLAG
		dbms with connection ta_session alias bauteilart, materialart, programm, ppsnummer, barcode, info2, info3, info4, anschlag
		dbms with connection ta_session sql select PARTTYPE, MATCAT, PROGRAMM, INFO1, BARCODE, INFO2, INFO3, INFO4, ANSCHLAG from IDBEXT where BARCODE = :+dok_dat_feld[ 32 ]
		
		anzahl_treffer = @dmrowcount
		dbms with connection ta_session alias
		dbms close connection ta_session
		
		if ( anzahl_treffer == 0 )
		{
			call xlog( 3, "Konstruktionszeichnungen: Achtung: Keine Treffer gefunden! " )
			// return-Statement auskommentiert von calb, 2015.12.10
			// weil: es sollen auch manuell Konstruktionszeichnungen importiert werden können, zu denen es keinen DB-Eintrag gibt.
			//return -1012
		}
		else
		{
			ergebnis = api_function( "string_cut_leading_char", anschlag, " " )
			
			if ( ergebnis >= 0 )
			{
				anschlag = api_converted_string
			}
			else
			{
				call xlog( 2, "Konstruktionszeichnungen: Achtung: Fehler beim Entfernen von Leerzeichen im Attribut 'Anschlag'!"  )
				return -1001
			}
		
			if ( bauteilart == "1" )
			{
				dok_dat_feld[ 8 ] = "Seiten"
			}
			
			if ( bauteilart == "3" )
			{
				dok_dat_feld[ 8 ] = "Einlegeböden"
			}
			
			if ( bauteilart == "4" )
			{
				dok_dat_feld[ 8 ] = "Oberböden"
			}
			
			if ( bauteilart == "5" )
			{
				dok_dat_feld[ 8 ] = "Unterböden"
			}
			
			if ( bauteilart == "6" )
			{
				dok_dat_feld[ 8 ] = "Rückwände"
			}
			
			if ( ( bauteilart == "8" ) || ( bauteilart == "9" ) || ( bauteilart == "10" ) )
			{
				dok_dat_feld[ 8 ] = "Türen"
			}
			
			if ( bauteilart == "13" )
			{
				dok_dat_feld[ 8 ] = "Konstruktionsböden"
			}
						
			if ( bauteilart == "14" )
			{
				dok_dat_feld[ 8 ] = "Mittelseiten"
			}
			
			if ( bauteilart == "23" )
			{
				dok_dat_feld[ 8 ] = "Blenden"
			}
			
			if ( bauteilart == "30" )
			{
				dok_dat_feld[ 8 ] = "Abdeckplatten"
			}
			
			if ( bauteilart == "21" )
			{
				dok_dat_feld[ 8 ] = "Schubkastenboden"
			}
			
			//dok_dat_feld[ 8 ] = bauteilart
			
			if ( materialart != "" )
			{
				dok_dat_feld[ 6 ] = materialart
			}
			
			if ( orientierung != "" )
			{
				dok_dat_feld[ 5 ] = orientierung
			}
			
			if ( programm != "" )
			{
				dok_dat_feld[ 2 ] = programm
			}
			
			if ( ppsnummer != "" )
			{
				dok_dat_feld[ 7 ] = ppsnummer
			}
			
			if ( info2 != "" )
			{
				dok_dat_feld[ 37 ] = info2
			}
			
			if ( info3 != "" )
			{
				dok_dat_feld[ 38 ] = info3
			}
			
			if ( info4 != "" )
			{
				dok_dat_feld[ 39 ] = info4
			}
			
			if ( anschlag != "" )
			{
				dok_dat_feld[ 40 ] = anschlag
			}
			
			
			
			//dok_dat_feld[ 3 ] = barcode
		}
		
		call xlog(3, "Konstruktionszeichnungen: Fertig mit Einlesen! PPS-Nummer: <:dok_dat_feld[ 7 ]>" )
	}
	// Ende Einfügung calb/d.OS am 2013.02.04
	
	if ( h_DocType == "dang" )
	{
		if ( @length( dok_dat_feld[ 1 ] ) == 0 )
		{
			dok_dat_feld[ 1 ]		= "9999999"
		}
	}
	
	
	if ( ( h_DocType == "DEBZ" ) || ( h_DocType == "DEBR" ) || ( h_DocType == "DEBG" ) || ( h_DocType == "EKBEL" )  || \
		( h_DocType == "CHEBZ" ) || ( h_DocType == "CHEBL" ) || ( h_DocType == "CHEBR" ) || ( h_DocType == "CHEBG" ) || ( h_DocType == "EKBEL" ) || \
		( ( h_DocType == "dlkb" ) && ( dok_dat_feld[ 2 ] == "" ) ) || ( ( h_DocType == "chlkb" ) && ( dok_dat_feld[ 2 ] == "" ) ) )
	{
		// calb / d.OS, 2013.06.14
		// Realisierung Einkaufsbelege / Lieferscheine (inkl. Retoure)
		if ( dok_dat_feld[ 6 ] != "nicht angegeben" )
		{
			call xlog( 4, "rufe Einkaufsbelege ... " )
			//call xlog( 4, "EK-Belege: Barcode: <:dok_dat_feld[ 6 ]> " )
			
			vars company[5000], doc_type[5000], field_no[5000], index_value[5000], field_name[5000]
			vars i, j, k, anzahl
			
			DBMS DECLARE DB_Session CONNECTION FOR USER 'EX_D3' PASSWORD 'NAVEX13' DATASOURCE 'ERP'
			//DBMS DECLARE DB_Session CONNECTION FOR USER 'calbers' PASSWORD 'calbers' DATASOURCE 'ca_system'
			
			DBMS WITH CONNECTION DB_Session ALIAS company, doc_type, field_no, index_value, field_name
			DBMS WITH CONNECTION DB_Session SQL select Company, ArchiveDocumentType, DocTypeFieldNo, IndexValue, DocTypeFieldName \
					from [Assmann_BM_DE$Index Values 4 Scanning Lines] where Barcode = :+dok_dat_feld[ 6 ]
					anzahl = @dmrowcount
			DBMS WITH CONNECTION DB_Session ALIAS
			DBMS CLOSE CONNECTION DB_Session
			
			j = 0
			
			call xlog( 4, "Anzahl Treffer: " ## anzahl )
			
			for i = 1 while i < 100 step 1
			{
				dok_dat_feld_60[ i ] = ""
			}
			// Erweiterung Hook durch Martin Lulei, Raber+Märcker, 13.06.2014, 09:28 (&& datei_erw != "txt")
			if ( ( doc_type[ 1 ] == "" ) && ( datei_erw != "TXT" ))
			{
				call api_log_error( "###MALU Dokumentart = :doc_type[1] Dateierweiterung = :datei_erw")
				call xlog( 2, "EK-Belege: Barcode: <:dok_dat_feld[ 6 ]> keine / nur leere Zeilen in der DB gefunden. " )
				additional_info_text = "Barcode: <:dok_dat_feld[ 6 ]> keine / nur leere Zeilen in der DB gefunden."
				return -8000
			}
			else
			{
				// Zuweisen der Dokumentart
				dok_dat_feld[ 49 ] = doc_type[ 1 ]
				
				call xlog( 4, "EK-Belege: Barcode: <:dok_dat_feld[ 6 ]> Dokumentart: <:doc_type[ 1 ]> " )
			
				for i = 1 while i <= 5000 step 1
				{
					if ( doc_type[ i ]  == "" )
					{
						k = i - 1
						call xlog( 3, "EK-Belege: Barcode: <:dok_dat_feld[ 6 ]> raus hier @ Zeile :k " )
						break
					}
					
					
					// Analyse der gelesenen Informationen
					
					// Zuweisen der Attributfelder
					if ( field_no[ i ] != 60 )
					{
						// eindimensionales Feld
						dok_dat_feld[ field_no[ i ] ] = index_value[ i ]
						//call xlog( 4, "EK-Belege: Barcode: <:dok_dat_feld[ 6 ]> Feld: dok_dat_feld_:field_no[ :i ] == <:index_value[ :i ]>" )
					}
					else
					{
						// mehrdimensionales Feld
						j = j + 1
						dok_dat_feld_60[ j ] = index_value[ i ]
						//call xlog( 4, "EK-Belege: Barcode: <:dok_dat_feld[ 6 ]> Feld: dok_dat_feld_60[ :j ] == <:index_value[ :i ]>" )
					}
				}
				
				// Zuweisen des Mandanten
				dok_dat_feld[ 31 ] = company[ 1 ]
				//call xlog( 3, "Mandant: <" ## dok_dat_feld[ 31 ] ## ">" )
			}
		}
	}
	// Ende Realisierung Einkaufsbelege
	
	
	call api_log_info( "### hook ### hook_insert_entry_10_ass ## :h_DocType ## start")
	
	if ( h_DocType != gDTS_INVOICE )
	{	
		call getBarcodeData()
	}
	//call xlog( 4, "Mandant: <" ## dok_dat_feld[ 31 ] ## ">" )
	call api_log_info( "### hook ### hook_insert_entry_10_ass ## :h_DocType ## end")
}

proc getBarcodeData()
{
	vars h_Hits, h_Error, h_ErrMsg

	if (dok_dat_feld[h_DDF_BARCODE]!="")
	{
		call prepareDbConnection()

		vars h_Company, h_DocType
		DBMS WITH CONNECTION :h_NavOdbcSource ALIAS h_Company, h_DocType
		DBMS WITH CONNECTION :h_NavOdbcSource \
			SQL SELECT Company, ArchiveDocumentType \
				FROM [Assmann_BM_DE$Index Values 4 Scanning Header] WHERE Barcode=:+dok_dat_feld[h_DDF_BARCODE]

		h_Hits   = @dmrowcount
		h_Error  = @dmengerrcode
		h_ErrMsg = @dmengerrmsg

		dok_dat_feld[h_DDF_DTTEMP]  = h_DocType
		dok_dat_feld[h_DDF_COMPANY] = h_Company

		call api_log_info( "###  barcode search: hits: :h_Hits ### DB error: :h_Error")

		DBMS WITH CONNECTION :h_NavOdbcSource ALIAS

		if (h_Hits>0)
		{
			vars h_FieldNo, h_Index, h_Value
			DBMS WITH CONNECTION :h_NavOdbcSource ALIAS h_FieldNo, h_Index, h_Value
			DBMS WITH CONNECTION :h_NavOdbcSource \
				SQL SELECT DocTypeFieldNo, NoOfMultipleField, IndexValue \
					FROM [Assmann_BM_DE$Index Values 4 Scanning Lines]  WHERE Barcode=:+dok_dat_feld[h_DDF_BARCODE]

			h_Error = @dmengerrcode

			vars h_i = 0
			while (@dmretcode!=DM_NO_MORE_ROWS && h_Error==0 && h_ErrMsg=="")
			{
				h_i = h_i + 1
				if (h_FieldNo>=60 && h_FieldNo<=69)
				{
					if (h_Index<=h_ARRAY_MAX)
					{
						(dok_dat_feld_:h_FieldNo)[h_Index] = h_Value
					}
				}
				else
				{
					dok_dat_feld[h_FieldNo] = h_Value
				}

				DBMS WITH CONNECTION :h_NavOdbcSource CONTINUE
				h_Error = @dmengerrcode
			}
			call api_log_info( "###  barcode values: hits: :h_i ## DB error: :h_Error ## Navision")
			DBMS WITH CONNECTION :h_NavOdbcSource ALIAS

			vars h_ScanCount, h_ScanCountTemp
			DBMS WITH CONNECTION :h_NavOdbcSource ALIAS h_ScanCountTemp
			DBMS WITH CONNECTION :h_NavOdbcSource \
				SQL SELECT ScanCount FROM [Assmann_BM_DE$Index Values 4 Scanning Header] WHERE Barcode=:+dok_dat_feld[h_DDF_BARCODE]

			h_ScanCount = h_ScanCountTemp

			// Datum ermitteln
			//call api_function ("get_current_datetime", "%0d.%0m.%4y")
			//call api_function ("get_current_datetime", "%0m-%0d-%4y")
			// Change date format to YYYYMMDD ---
			// call api_function ("get_current_datetime", "%4y%0m%0d")
			call api_function ("get_current_datetime", "%0m.%0d.%4y")
			// Change date format to YYYYMMDD +++
			vars h_Datum = api_single_info
			call api_log_info( "###  h_Datum: :h_Datum")
			
			DBMS WITH CONNECTION :h_NavOdbcSource ALIAS

			h_ScanCount = h_ScanCount + 1

			DBMS WITH CONNECTION :h_NavOdbcSource \
				SQL UPDATE [Assmann_BM_DE$Index Values 4 Scanning Header]  SET ScanCount=:h_ScanCount, LastScan=:+h_Datum WHERE Barcode=:+dok_dat_feld[h_DDF_BARCODE]
			DBMS WITH CONNECTION :h_NavOdbcSource COMMIT

			h_Error = @dmengerrcode

			call api_log_info( "###  barcode scan counter incremented: barcode: :dok_dat_feld[h_DDF_BARCODE], counter: :h_ScanCount, LastScan: :h_Datum ### DB error: :h_Error ## Navision")
		}
      
		return h_Hits
	}
}

// #####################################################################################
// hook_insert_exit_30_d3Nav
// #####################################################################################

proc  hook_insert_exit_30_d3Nav (h_DocId, h_FileDestination, h_CountmportOk, h_User, h_DocType)
{
	call api_log_info( "### hook ### hook_insert_exit_30_d3Nav ## :h_DocType :h_DocId ## start")
	
	call InsertExit30(h_DocId, h_FileDestination, h_CountmportOk, h_User, h_DocType)
																				 
	call updateAttributes(h_DocType, h_DocId)
	
	if(h_DocType == "AKRVG")
	{
		call linkDeliveryNotes(h_DocId)
	}

	call api_log_info( "### hook ### hook_insert_exit_30_d3Nav ## :h_DocType ## end")
}



// #####################################################################################
// hook_upd_attrib_exit_20_d3Nav
// #####################################################################################

proc hook_upd_attrib_exit_20_d3Nav (h_DocId, h_ErrNo, h_User, h_DocType)
{
	call api_log_info("### Hook ## hook_upd_attrib_exit_20_d3Nav ## :h_DocType :h_DocId ## start")
	
	call UpdateAttribExit20 (h_DocId, h_ErrNo, h_User, h_DocType)
															  
	call updateAttributes(h_DocType, h_DocId)

	if (dok_dat_feld[h_DDF_BARCODE]!="")
	{
		vars h_Error
                                      
		call prepareDbConnection()

		DBMS WITH CONNECTION :h_NavOdbcSource \
			SQL UPDATE [Assmann_BM_DE$Index Values 4 Scanning Header] SET ArchivDocID=:+h_DocId WHERE Barcode=:+dok_dat_feld[h_DDF_BARCODE]
		DBMS WITH CONNECTION :h_NavOdbcSource COMMIT

		h_Error = @dmengerrcode
		call api_log_info( "###  barcode: set doc id: :h_DocId ### DB error: :h_Error ## Navision")
	}

	call api_log_info( "### hook ### hook_insert_exit_30_d3Nav ## :h_DocType ## end")
	
	if(h_DocType == "AKRVG")
	{
		//Prüfe auf Änderungen der Lieferscheinnummern
		vars x
		vars hasChanged = "false"
		for x=1 while x<=CUR_60ER_FIELD_NR step 1
		{
			if(old_dok_dat_feld_63[x] != dok_dat_feld_63[x])
			{
				hasChanged = "true"
			}
		}
		if( hasChanged == "true" )
		{
			call linkDeliveryNotes(h_DocId)
		}
		else 
		{
			call api_log_info("no changes relevant for linking")
		}
	}
}

proc linkDeliveryNotes(h_DocId)
{
	call api_log_info( "start linkDeliveryNotes")

	//Lösen der Verbindungen
	vars h_ReturnValue
	h_ReturnValue = api_function("link_get_children", h_DocId, "")
	vars client = dok_dat_feld[31]
	vars clientNo = dok_dat_feld[81]
	vars supplierNoArray[CUR_60ER_FIELD_NR]
	vars j
	for j=1 while j<=CUR_60ER_FIELD_NR step 1
	{
		supplierNoArray[j] = dok_dat_feld_63[j]
	}		
	
	if (h_ReturnValue == 0)
	{
		vars h_Count
		vars h_tmpDocId
		vars h_creator
		vars tmpChildren = api_single_info
		for h_Count = 1 while h_Count <= tmpChildren step 1
		{
			h_tmpDocId = api_links[h_Count]
			h_creator = api_link_creators[h_Count]
			if(h_tmpDocId != "" && h_creator != "m")
			{
				vars h_tmpDoktype
				h_ReturnValue = api_function ("document_type_get_short", "", h_tmpDocId)
				
				if (h_ReturnValue == 0)
				{
					h_tmpDoktype = api_single_info
					if(h_tmpDoktype == "DEBL")
					{
						h_ReturnValue = api_function ("link_delete", h_DocId, h_tmpDocId, "decsapi")
						
						if(h_ReturnValue == 0)
						{
							call api_log_info("Verknüpfung entfernt parent :h_DocId child :h_tmpDocId")
						}
						else
						{
							call api_log_error("Fehlernummer :h_ReturnValue")
						}
					}
				}
				else
				{
					call api_log_error("Fehlernummer :h_ReturnValue wurde zurückgeliefert!")
				}
			}
		}
	}
	else
	{
		call api_log_error("Fehlernummer :h_ReturnValue wurde zurückgeliefert!")
	}
	
	//Erstellen der Verbindungen
	vars i
	for i=1 while i<=CUR_60ER_FIELD_NR step 1
	{
		if(supplierNoArray[i] != "")
		{
			call api_clear_document_context()
			api_doc_type_short = "DEBL"
			api_doc_field[31] = client
			api_doc_field[81] = clientNo
			api_doc_field[20] = supplierNoArray[i]
			
			if(api_doc_field[31] != "" && api_doc_field[81] != "" && api_doc_field[20] != "")
			{
				h_ReturnValue = api_function ("document_find_ids", "decsapi")
				if (h_ReturnValue == 0)
				{     
					vars y = api_single_info
					for y = 1 while y <= api_single_info step 1
					{
						vars tmpChildLinkDocId = api_doc_ids[y]
						call api_log_info("doc_id :y: :api_doc_ids[y]")
						
						h_ReturnValue = api_function ("link_documents", "", tmpChildLinkDocId, "", 0,1)
						
						if (h_ReturnValue == 0)
						{
							call api_log_info("Verknüpfung erstellt zwischen parent :h_DocId und child :tmpChildLinkDocId")
						}
						else
						{
							call api_log_error("Fehlernummer :h_ReturnValue wurde zurückgeliefert!")
						}
					}
				}
				else
				{
					call api_log_error("Fehlernummer :h_ReturnValue wurde zurückgeliefert!")
				}
			}
		}
	}	
	call api_log_info( "end linkDeliveryNotes")
}

proc updateAttributes(h_DocType, h_DocId)
{
	if (h_DocType==h_DT_SOCONF)
	{
		// update quote attribute to relink document
		call updateForeignAttribute (h_DocId, h_DocType, h_DDF_SQUOTENO, h_DDF_SORDERNO)
	}
}

proc updateForeignAttribute (h_DocId, h_SourceDocType, h_MatchField, h_CopyField)
{
	vars h_Count, h_MatchValue, h_CopyValue, h_Hits, h_Error
	
	h_MatchValue = dok_dat_feld[h_MatchField]
	h_CopyValue = dok_dat_feld[h_CopyField]

	if (h_MatchValue!="" && h_CopyValue!="" && h_UpdateAttributes==1)
	{
		h_UpdateAttributes = 0  // avoid recursion
		
		vars h_UpdateDocIds[100]
		DBMS ALIAS h_UpdateDocIds
		DBMS SQL SELECT doku_id FROM firmen_spezifisch \
			 WHERE dok_dat_feld_:h_MatchField=:+h_MatchValue and kue_dokuart<>:+h_SourceDocType
		DBMS ALIAS
		
		h_Hits  = @dmrowcount
		h_Error = @dmengerrcode

		for h_Count = 1 while h_UpdateDocIds[h_Count]!="" step 1
		{
			call api_log_info("### update foreign attribute ## :h_UpdateDocIds[h_Count] ## match: field :h_MatchField -> :h_MatchValue # copy: field :h_CopyField -> :h_CopyValue ###")
			call api_function("attribute_update_single", h_CopyField, h_CopyValue, 1, h_UpdateDocIds[h_Count], h_EditUser)
		}
		
		h_UpdateAttributes = 1
	}
}

// #####################################################################################
// helper functions
// #####################################################################################

proc prepareDbConnection()
{
	if(!dm_is_connection(h_NavOdbcSource))
	{
		vars h_Error

		DBMS DECLARE :h_NavOdbcSource CONNECTION FOR \
			USER 'EX_D3' PASSWORD 'NAVEX13' DATASOURCE ':h_NavOdbcSource'
		h_Error = @dmengerrcode
		if (h_Error==0)
		{
			call api_log_info( "### Connect: ODBC source: :h_NavOdbcSource")
		}
		else
		{
			call api_log_error( "### Database connection failed. ODBC source: 'ERP'. Error: :h_Error")
		}
	}
}
