FF-Script incorrect: Expression-Data-Error: XCNT.GetFreeArgByName(Language): Cannot determine Script-Argument-Names with 'GetInfoScriptArg': Err-147: FF-Script incorrect: Expression-Syntax-Error: Parsing failed (Eine Ausnahme vom Typ "System.OutOfMemoryException" wurde ausgelöst.):
// ------------------------------------------------------------------------------------------------------
// Liefertermin eines Artikels ermitteln
// Dateiname: MH-WPgetDeliveryDate.fbs
// Kunde: <CustomerName>
// Kontext: <Context>
// Autor: OPACC Software AG, Luzern - <CreatorName>
// Erstellt: 13.05.2026 / <CreatorShortCut>
// Geändert: <Datum> / <Kürzel> - <Kurzbeschreibung>
// ------------------------------------------------------------------------------------------------------
{
// using "LibraryName.FBL"
function CheckSpecialDay(var vDateToCheck := '')
{
var vIsSpecialDay := ''
var vCacheKey := 'SpecialDay-' + dateToStr(vDateToCheck,'yyyyMMdd')
var vCached := X.Get(vCacheKey)
// Bereits geprüfte Tage nicht nochmals beim Server abfragen, 1 = Feiertag, 2 = normaler Tag
if(vCached = '1')
{
vIsSpecialDay := '1'
}
if(vCached = '')
{
var request := 'GetBo_ScheduledJobCalendar'
XSER.Undefine('req'+request)
XSER.SetService('req'+request,'Biz.GetBo')
XSER.AddArg('req'+request,'ScheduledJobCalendarDay')
XSER.AddArg('req'+request,'2,' + vDateToCheck)
XSER.AddArg('req'+request,'e')
XSER.AddArg('req'+request,'')
XSER.AddArg('req'+request,'1')
XSER.AddArg('req'+request,'0')
XSER.AddArg('req'+request,'')
XSER.AddArg('req'+request,'ScheduledJobCalendarDay.Day')
XSER.Execute('req'+request,'res'+request)
var vSpecialCalendarDay := XRES.GetColValByName('res'+request, 'ScheduledJobCalendarDay.Day')
X.Set(vCacheKey,'2')
if(vSpecialCalendarDay <> '')
{
vIsSpecialDay := '1'
X.Set(vCacheKey,'1')
}
}
return vIsSpecialDay
}
function CheckDaytime()
{
var vDaysToAdd := number(0)
var request := 'GetBo_ScriptUserFuncArg'
XSER.Undefine('req'+request)
XSER.SetService('req'+request,'Biz.GetBo')
XSER.AddArg('req'+request,'ScriptUserFuncArg')
XSER.AddArg('req'+request,'507.HH.MM')
XSER.AddArg('req'+request,'e')
XSER.AddArg('req'+request,'')
XSER.AddArg('req'+request,'1')
XSER.AddArg('req'+request,'')
XSER.AddArg('req'+request,'')
XSER.AddArg('req'+request,'ScriptUserFuncArg.Value')
XSER.Execute('req'+request,'res'+request)
if(time(now()) > time(XRES.GetColValByName('res'+request, 'ScriptUserFuncArg.Value')))
{
vDaysToAdd := number(1)
}
return vDaysToAdd
}
// Lagerort-Vorgaben aus ScriptUserFuncArg 507 lesen
// ScriptUserFuncArg.SeqNo = Prioritaet der Beruecksichtigung
// ScriptUserFuncArg.Argument = Lagerort-Nummer
// ScriptUserFuncArg.Value = vStockAddDaysFrom/vStockAddDaysTo, beide Werte absolut ab Bestelldatum
function ReadStockLocConfig() : string
{
var vStockLocCount := number(0)
X.Set('StockLocCfgList','')
var request := 'GetBo_ScriptUserFuncArgStockLoc'
XSER.Undefine('req'+request)
XSER.SetService('req'+request,'Biz.GetBo')
XSER.AddArg('req'+request,'ScriptUserFuncArg')
XSER.AddArg('req'+request,'507')
XSER.AddArg('req'+request,'f')
XSER.AddArg('req'+request,'2')
XSER.AddArg('req'+request,'99')
XSER.AddArg('req'+request,'1')
XSER.AddArg('req'+request,'')
XSER.AddArg('req'+request,'ScriptUserFuncArg.SeqNo,ScriptUserFuncArg.Argument,ScriptUserFuncArg.Value')
XSER.Execute('req'+request,'res'+request)
var rows := XRES.GetNmbOfRows('res'+request)
for(var irows := 1, irows <= rows, ++irows)
{
var vSeqNo := trim(XRES.GetColValByName('res'+request, 'ScriptUserFuncArg.SeqNo', irows))
var vArgument := trim(XRES.GetColValByName('res'+request, 'ScriptUserFuncArg.Argument', irows))
var vValue := trim(XRES.GetColValByName('res'+request, 'ScriptUserFuncArg.Value', irows))
// Analyse - jede gelesene Zeile protokollieren, auch die nicht verwendeten
X.Set('StockLocCfgList',X.Get('StockLocCfgList') + 'Seq' + vSeqNo + '=' + vArgument + ':' + vValue + '; ')
// Nur Zeilen mit Lagerort und Vorgabe "von/bis" verwenden, Zeitgrenze HH.MM wird ignoriert
if(vArgument <> '' and pos('/',vValue) > 0)
{
vStockLocCount := number(vStockLocCount + 1)
X.Set('StockLocNo-'+string(vStockLocCount),vArgument)
X.Set('StockLocAddDaysFrom-'+string(vStockLocCount),split(vValue,'/',1))
X.Set('StockLocAddDaysTo-'+string(vStockLocCount),split(vValue,'/',2))
}
}
X.Set('StockLocCfgRows',string(rows))
return string(vStockLocCount)
}
function GetStock(var vArtNo := '' , var vStockLocNo := '')
{
var vInventory := number(0)
var request := 'GetBo_StockControl'
XSER.Undefine('req'+request)
XSER.SetService('req'+request,'Biz.GetBo')
XSER.AddArg('req'+request,'StockControl')
XSER.AddArg('req'+request,vArtNo + ',21,'+ vStockLocNo +',2,,')
XSER.AddArg('req'+request,'e')
XSER.AddArg('req'+request,'')
XSER.AddArg('req'+request,'1')
XSER.AddArg('req'+request,'')
XSER.AddArg('req'+request,'')
XSER.AddArg('req'+request,'StockControl.ActOwnDisp')
XSER.Execute('req'+request,'res'+request)
var rows := XRES.GetNmbOfRows('res'+request)
var logMessage := XRES.GetMsgText('res'+request)
for (var irows := 1, irows <= rows, ++irows)
{
vInventory := (vInventory + XRES.GetColValByName('res'+request, 'StockControl.ActOwnDisp', irows))
}
return vInventory
}
function DayCheck(var vDaysToAdd := '')
{
var vNoOfCheck := '9'
for(var icount := 1, icount <= vNoOfCheck, ++icount)
{
var vDateToCheck := date((number(now())+number(vDaysToAdd)))
var vIsSpecialDay := CheckSpecialDay(vDateToCheck)
if (vIsSpecialDay <> '')
{
vDaysToAdd := number(number(vDaysToAdd)+1)
}
if (vIsSpecialDay = '' and weekdayOfDate(vDateToCheck) = '6')
{
vDaysToAdd := number(number(vDaysToAdd)+2)
}
if (vIsSpecialDay = '' and weekdayOfDate(vDateToCheck) = '7')
{
vDaysToAdd := number(number(vDaysToAdd)+1)
}
if (vIsSpecialDay = '' and weekdayOfDate(vDateToCheck) < '6')
{
icount := asNumber(vNoOfCheck)
}
}
return vDaysToAdd
}
// Vorgabe als Arbeitstage ab heute vorrücken, Wochenenden und Feiertage zählen nicht mit
function AddWorkDays(var vWorkDays := '')
{
var vDaysToAdd := DayCheck('0')
var vSteps := number(vWorkDays)
for(var icount := 1, icount <= vSteps, ++icount)
{
vDaysToAdd := DayCheck(number(vDaysToAdd)+1)
}
return vDaysToAdd
}
function Main() : string
{
XFAS.AddHeads('DeliveryInfo','InternalInfo','DaysToAdd','DaysToAddFrom','DaysToAddTo','StockPrio','StockLocNo','AddDaysFrom','AddDaysTo','CfgRows','CfgCount','CfgList','StockList')
var vLanguageNo := string(XCNT.GetLangNo())
if(XCNT.GetFreeArgByName('Language') <> '')
{
vLanguageNo := XCNT.GetFreeArgByName('Language')
}
var vArtIntNo := XCNT.GetFreeArgByName('ArtIntNo')
var vDeliveryInfo := ''
var vDaysToAdd := ''
var vDaysToAddFrom := ''
var vDaysToAddTo := ''
var vStockAddDaysFrom := number(0)
var vStockAddDaysTo := number(0)
var vStockPrio := ''
X.Set('DayNo-11','Mo.')
X.Set('DayNo-12','Di.')
X.Set('DayNo-13','Mi.')
X.Set('DayNo-14','Do.')
X.Set('DayNo-15','Fr.')
X.Set('DayNo-21','lun.')
X.Set('DayNo-22','mar.')
X.Set('DayNo-23','mer.')
X.Set('DayNo-24','jeu.')
X.Set('DayNo-25','ven.')
X.Set('DayNo-31','Mon.')
X.Set('DayNo-32','Tur.')
X.Set('DayNo-33','Wed.')
X.Set('DayNo-34','Thu.')
X.Set('DayNo-35','Fri.')
vDaysToAdd := CheckDaytime()
// Bestände je Lagerort prüfen
// Reihenfolge, Lagerorte und Tag-Vorgaben gemäss ScriptUserFuncArg 507
var vStockLocCount := number(ReadStockLocConfig())
var vStockLocNo := ''
var vInventory := number(0)
X.Set('StockLocInvList','')
for(var iStockLoc := 1, iStockLoc <= vStockLocCount, ++iStockLoc)
{
var vStockLocNoCheck := X.Get('StockLocNo-'+string(iStockLoc))
vInventory := GetStock(vArtIntNo,vStockLocNoCheck)
// Analyse - jeden geprüften Lagerort mit Bestand und Vorgabe protokollieren
X.Set('StockLocInvList',X.Get('StockLocInvList') + 'Prio' + string(iStockLoc) + '=' + vStockLocNoCheck + ':' + X.Get('StockLocAddDaysFrom-'+string(iStockLoc)) + '/' + X.Get('StockLocAddDaysTo-'+string(iStockLoc)) + ' Best=' + string(vInventory) + '; ')
// Erster Lagerort mit Bestand bestimmt die Lieferzeiten
if (vInventory > 0)
{
vStockAddDaysFrom := number(X.Get('StockLocAddDaysFrom-'+string(iStockLoc)))
vStockAddDaysTo := number(X.Get('StockLocAddDaysTo-'+string(iStockLoc)))
vStockPrio := string(iStockLoc)
vStockLocNo := vStockLocNoCheck
iStockLoc := vStockLocCount
}
}
if (vInventory > 0)
{
// Check 1 - Wann verlässt die Ware das Haus, Vorgabe "von" in Arbeitstagen
vDaysToAddFrom := AddWorkDays(number(vDaysToAdd)+number(vStockAddDaysFrom))
// XFAS.NewRow()
// XFAS.AddCells('vOutDate in',vDaysToAdd)
// var vOutDate := date((number(now())+number(vDaysToAdd)))
// Check 2 - wann Auslieferung beim Kunden, einen Arbeitstag nachdem die Ware das Haus verlassen hat
vDaysToAddFrom := DayCheck(number(vDaysToAddFrom)+1)
// Check 3 - Wann verlässt die Ware das Haus für den "bis" Termin, Vorgabe "bis" absolut in Arbeitstagen
vDaysToAddTo := AddWorkDays(number(vDaysToAdd)+number(vStockAddDaysTo))
// Check 4 - wann Auslieferung beim Kunden, gleiche Regel wie beim "von" Termin
vDaysToAddTo := DayCheck(number(vDaysToAddTo)+1)
// Absicherung gegen eine Vorgabe "bis" die kleiner als die Vorgabe "von" ist
if (number(vDaysToAddTo) < number(vDaysToAddFrom))
{
vDaysToAddTo := vDaysToAddFrom
}
var vDeliveryDateFrom := date((number(now())+number(vDaysToAddFrom)))
var vDeliveryDateTo := date((number(now())+number(vDaysToAddTo)))
var vDayNoFrom := string(weekdayOfDate(vDeliveryDateFrom))
var vDayNoTo := string(weekdayOfDate(vDeliveryDateTo))
// XFAS.NewRow()
// XFAS.AddCells('vDeliveryDate in',vDaysToAdd)
var vDateTomorow := date((number(now())+1))
var vDateTomorow2 := date((number(now())+2))
if(vDeliveryDateFrom = vDeliveryDateTo and vDeliveryDateFrom = vDateTomorow)
{
if (vLanguageNo = '1')
{
vDeliveryInfo := 'morgen, '+ X.Get('DayNo-1'+ vDayNoFrom) + ' ' + dateToStr(vDeliveryDateFrom,'dd.MM.') + ' geliefert'
}
if (vLanguageNo = '2')
{
vDeliveryInfo := 'livré demain '+ X.Get('DayNo-2'+ vDayNoFrom) + ' ' + dateToStr(vDeliveryDateFrom,'dd.MM.') + ''
}
if (vLanguageNo = '3')
{
vDeliveryInfo := 'delivered tomorrow '+ X.Get('DayNo-3'+ vDayNoFrom) + ' ' + dateToStr(vDeliveryDateFrom,'dd.MM.') + ''
}
}
if(vDeliveryDateFrom = vDeliveryDateTo and vDeliveryDateFrom <> vDateTomorow)
{
if (vLanguageNo = '1')
{
vDeliveryInfo := 'am '+ X.Get('DayNo-1'+ vDayNoFrom) + ' ' + dateToStr(vDeliveryDateFrom,'dd.MM.') + ' geliefert'
}
if (vLanguageNo = '2')
{
vDeliveryInfo := 'livré '+ X.Get('DayNo-2'+ vDayNoFrom) + ' ' + dateToStr(vDeliveryDateFrom,'dd.MM.') + ''
}
if (vLanguageNo = '3')
{
vDeliveryInfo := 'delivered '+ X.Get('DayNo-3'+ vDayNoFrom) + ' ' + dateToStr(vDeliveryDateFrom,'dd.MM.') + ''
}
}
if(vDeliveryDateFrom <> vDeliveryDateTo)
{
if (vLanguageNo = '1')
{
vDeliveryInfo := 'zwischen ' + X.Get('DayNo-1'+ vDayNoFrom) + ' ' + dateToStr(vDeliveryDateFrom,'dd.MM.') + ' und ' + X.Get('DayNo-1'+ vDayNoTo) + ' ' + dateToStr(vDeliveryDateTo,'dd.MM.') + ' geliefert'
}
if (vLanguageNo = '2')
{
vDeliveryInfo := 'livré entre ' + X.Get('DayNo-2'+ vDayNoFrom) + ' ' + dateToStr(vDeliveryDateFrom,'dd.MM.') + ' et ' + X.Get('DayNo-2'+ vDayNoTo) + ' ' + dateToStr(vDeliveryDateTo,'dd.MM.') + ''
}
if (vLanguageNo = '3')
{
vDeliveryInfo := 'delivered between ' + X.Get('DayNo-3'+ vDayNoFrom) + ' ' + dateToStr(vDeliveryDateFrom,'dd.MM.') + ' and ' + X.Get('DayNo-3'+ vDayNoTo) + ' ' + dateToStr(vDeliveryDateTo,'dd.MM.') + ''
}
}
}
XFAS.NewRow()
XFAS.AddCells(vDeliveryInfo,'DaysToAdd:' + vDaysToAdd + ' StockPrio:' + vStockPrio + ' StockLoc:' + vStockLocNo,string(vDaysToAdd),string(vDaysToAddFrom),string(vDaysToAddTo),vStockPrio,vStockLocNo,string(vStockAddDaysFrom),string(vStockAddDaysTo),X.Get('StockLocCfgRows'),string(vStockLocCount),X.Get('StockLocCfgList'),X.Get('StockLocInvList'))
return vDeliveryInfo
}
Main()
// #region Script Infos
function GetInfoScript() : void
{
XFAS.AddHeads('SupportsScreenOutput','SupportsBoArgs','SupportedBoType','MlsKey')
XFAS.SetCol('SupportsScreenOutput', '0')
XFAS.SetCol('SupportsBoArgs', '0')
XFAS.SetCol('SupportedBoType', 'Addr')
XFAS.SetCol('MlsKey', 'U.' + XCNT.GetScriptName())
}
function GetInfoScriptArg() : void
{
XFAS.AddHeads('Argument','StateCd','DataTypeCd','Format','RelationshipCd','RelatedObject','RelatedIndex','RelatedConstraint','ConstraintType','CheckExpression','DefaultValue','EntryMode','WithPrevious','MlsKey')
XFAS.SetCol('Argument', 'ArtIntNo')
XFAS.SetCol('StateCd', '1') // 0:passiv, 1:active
XFAS.SetCol('DataTypeCd', 'A') // A:AlphaAll, X:AlphaUC, R:NumAll, N:NumNotNeg, D:Date, H:Time, B:Boolean, T:Text
XFAS.SetCol('Format', '16')
XFAS.SetCol('RelationshipCd', '1') // 0:No, 1:Bo, 1S:BoSet, 2:BoOption, 3:Code, 4:CodeOption, 5:Range, 6:RangeOption, 7:ApsKeyword, 8:ApsKeywordOption, I:InstallationFile, J:FileStorage
XFAS.SetCol('RelatedObject', 'Art.InternalNo') // No, Bo, Code, ApsKeyword, InstallationFile, FileStorage, ..
XFAS.SetCol('RelatedIndex', '')
XFAS.SetCol('RelatedConstraint','')
XFAS.SetCol('ConstraintType', '')
XFAS.SetCol('CheckExpression', '')
XFAS.SetCol('DefaultValue', '')
XFAS.SetCol('EntryMode', '0') // 0:Default, 1:Must, 2:Locked
XFAS.SetCol('WithPrevious', '0') // 0:on new line, 1:on same line
XFAS.SetCol('MlsKey', 'ArtIntNo')
XFAS.NewRow()
XFAS.SetCol('Argument', 'Language')
XFAS.SetCol('StateCd', '1') // 0:passiv, 1:active
XFAS.SetCol('DataTypeCd', 'A') // A:AlphaAll, X:AlphaUC, R:NumAll, N:NumNotNeg, D:Date, H:Time, B:Boolean, T:Text
XFAS.SetCol('Format', '16')
XFAS.SetCol('RelationshipCd', '1') // 0:No, 1:Bo, 1S:BoSet, 2:BoOption, 3:Code, 4:CodeOption, 5:Range, 6:RangeOption, 7:ApsKeyword, 8:ApsKeywordOption, I:InstallationFile, J:FileStorage
XFAS.SetCol('RelatedObject', 'Language.Number') // No, Bo, Code, ApsKeyword, InstallationFile, FileStorage, ..
XFAS.SetCol('RelatedIndex', '')
XFAS.SetCol('RelatedConstraint','')
XFAS.SetCol('ConstraintType', '')
XFAS.SetCol('CheckExpression', '')
XFAS.SetCol('DefaultValue', '')
XFAS.SetCol('EntryMode', '0') // 0:Default, 1:Must, 2:Locked
XFAS.SetCol('WithPrevious', '0') // 0:on new line, 1:on same line
XFAS.SetCol('MlsKey', 'Language')
}
// #endregion
}3-2-00005