Documentation συναρτήσεων

2,501 views
Skip to first unread message

vangelis pistolas

unread,
Nov 10, 2009, 6:08:06 AM11/10/09
to so...@googlegroups.com
Ξέρει κανείς που υπάρχει documentation για τις συναρτήσεις της S1 Batch Script Language (SBSL); Έχω βρει κάτι αλλά δεν τεκμηριώνονται όλες οι συναρτήσεις. Π.χ.
1. Converter ConvItem         (MTRL,       'COMPANY;CODE;SODTYPE=51', MTRL);
2. Module=CallPublished('ModuleIntf.CreateModule','SALDOC,WARNINGS:OFF');
3. x=CallPublished('ModuleIntf.LocateModule',VarArray(Module,sItem.FINDOC,2));
4. x=CallPublished('ModuleIntf.DataSetLocate',VarArray(vIteLines,'MTRL;MTRLINES',VarArray(sItem.MTRL,sItem.MTRLINES,2),3));
 
Δεν έχω βρει κάτι για αυτές καθώς για τις παραμέτρους τους που δηλώνονται σαν VarArray
 
Ευχαριστώ



Χρησιμοποιείτε Yahoo!
Βαρεθήκατε τα ενοχλητικά μηνύ ματα (spam); Το Yahoo! Mail διαθέτει την καλύτερη δυνατή προστασία κατά των ενοχλητικών μηνυμάτων
http://login.yahoo.com/config/mail?.intl=gr

Νίκος Μάλιακκας

unread,
Nov 16, 2009, 5:07:40 PM11/16/09
to Softone Developers Network
Στα αρχεία αφήνω και το S1 Batch Script Language (SBSL).doc
το οποίο περιέχει τα παρακάτω σε πιο ευκολα να διαβάσει κανείς μορφή
(τα αντιγράφω και εδώ γιατί διευκολίνει στην αναζήτηση)
Οποιος έχει όρεξη να συνεχίσει/επεκτείνει το κείμενο είναι
καλοδεχούμενος, σε 2-3 μέρες θα έχω και όλα τα tips μαζεμένα
Καλό διάβασμα!


S1 Batch Script Language (SBSL)

Στοιχεία του αρχείου:
1. FORM SECTION
2. CONVERTER SECTION
3. VAR (IABLE DEFINITION SECTION)
4. CONNECTIONS SECTION
5. IMPORT SECTION
6. FUNCTIONS SECTION
{
7. MAIN PROGRAM //τα { } είναι υποχρεωτικά ότι είναι γραμμένο μέσα σε
αυτά θα εκτελεσθεί γραμμή-γραμμή
}
Σημειώσεις:
// Comments Ορίζονται με δύο ανάποδες καθέτους (δια)
FORM SECTION
Εδώ είναι το κομμάτι στο οποίο σχεδιάζουμε την προβολή που θα
εμφανίζετε στον χρήστη. Όπως και στον γραφικό designer μπορούμε να
ορίσουμε πίνακες και τις στήλες τους και πάνελ στα οποία θα δείχνουμε
τις στήλες των πινάκων.
Σε απλά script θα έχουμε μόνο έναν πίνακα (ImpTable) οι στήλες του
οποίου θα είναι οι ερωτήσεις του script. Σε πιο σύνθετα μπορούμε να
έχουμε και πίνακες οι οποίοι θα γεμίζουν από κάποιο query ή θα
μπορούμε να τους κάνουμε edit χρησιμοποιώντας ένα grid με το οποίο θα
τους συνδέσουμε.
Παράδειγμα:
form {
[TABLES]
ImpTable=;;;;Master;3;0

[ImpTable]
vImpOK=2;15;1;1;0;Εισαγωγή Παραστατικών πωλήσεων;$Y;;0;1
vFdate=11;25;1;1;0;Από ημερ/νία;;;:X.SYS.FYDATE;
vLdate=11;25;1;1;0;Εως ημερ/νία;;;:X.SYS.LYDATE;
vImpnOK=2;15;1;1;0;Επιβεβαίωση μεταφοράς;$Y;;0;1
vBillType=3;40;1;1;0;Τύπος παραστατικών;JOB;;;

[PANELS]
PANEL11=0;;0;065,000,000,000,G10
PANEL12=0;;0;055,055,000,000,G10

[PANEL11]
ImpTable.vImpOK
ImpTable.vImpnOK
[PANEL12]
ImpTable.vFdate
ImpTable.vLdate

[STRINGS]
JOB=1251
[JOB]
1251=παραστατικά αγορών
1351=παραστατικά πωλήσεων
7151=παραστατικά παραγωγής
1151=παραστατικά φυσικής απογραφής
}

// TableName = OriginalTableName; DomainFieldName {SoDtype or
CustType}; DomainFieldValue {12,51}; LocateStr; Caption; FieldType
{0,1,2,3=Sql, Report, Function}; 1 to 1 relation
// panelname = PanelType; Caption; Level; Info;
// filename = DataType; DisplaySize; Require; Visible; ReadOnly;
Caption; Editor; TblEditor; Forced; Default
// datatype = 1=ftString, 2=ftSmallint, 3=ftInteger, 4=ftWord,
6=ftFloat, 11=ftDateTime, 16=ftMemo

[TABLES] SECTION
Εδώ ορίζουμε τα αρχικά Dataset/ Πίνακες που θα χρησιμοποιήσουμε. Στην
απλή μορφή θα έχουμε μόνο τον πίνακα ImpTable, οι στήλες του οποίου θα
είναι τα πεδία των ερωτήσεων.
// TableName = OriginalTableName; DomainFieldName {SoDtype or
CustType}; DomainFieldValue {12,51}; LocateStr; Caption; FieldType
{0,1,2,3=Sql, Report, Function}; 1 to 1 relation
[TABLES]
ImpTable=;;;;Master;3;0
MCOMPANY=;;;;Master;3;0
Για κάθε πίνακα μετά ορίζουμε τα πεδία του πχ:
[ImpTable]
// filename = DataType; DisplaySize; Require; Visible; ReadOnly;
Caption; Editor; TblEditor; Forced; Default
// datatype = 1=ftString, 2=ftSmallint, 3=ftInteger, 4=ftWord,
6=ftFloat, 11=ftDateTime, 16=ftMemo
vImpOK=2;15;1;1;0;Επιβεβαίωση μεταφοράς;$Y;;0;1
vChk=2;15;1;1;0;Έλεγχος Αντιστοίχισης Σειρών;$Y;;0;1
vFdate=11;25;1;1;0;Από ημερ/νία;;;:X.SYS.FYDATE;
vLdate=11;25;1;1;0;Εως ημερ/νία;;;:X.SYS.LYDATE;
vOpt=2;15;1;1;0;Αντιστοίχιση;XCMD:$IMPCNV;;0;0
vTrdr=1;25;1;1;0;Συναλλασσόμενος;CUSTOMER(M,R[CODE]);;;
vTrdr=1;25;1;1;0;Συναλλασσόμενος;CALCELM(M,R[NAME]);;;
vDB=1;2000;1;1;0;Όνομα Βάσης προς μεταφορά;;;;softone.DBO
vCom1=2;15;1;1;0;Εταιρία(Πωλήσεις);MCOMPANY;;2;
vCom2=2;15;0;1;0;Εταιρία(Αγορές);COMPANY;;3;
vImpMess=16;64000;0;1;1;Μηνύματα μεταφοράς...;;;;
[MCOMPANY]
COMPANY=3;0;0;0;0;Εταιρεία;;;;
NAME=1;30;0;1;0;Περιγραφή;;;;
[PANELS] SECTION
[PANELS]
// panelname = PanelType; Caption; Level; Info;
PanelType: 0: panel , 1:page, 2:grid, 3:subform, 4: Memo

PANEL11=0;;0;065,000,000,000,G10
PANEL12=0;;0;055,055,000,000,G10
PANEL15=4;Μηνύματα εργασίας;0;100,G10,N,L3

Τα 4 νούμερα 055,055,000,000 αφορούν το μέγεθος % της κάθε στήλης του
πάνελ, κατά τον ίδιο τρόπο όπως στην σχεδίαση προβολής (για απλά
panel)
Μετά, για κάθε πάνελ, γράφουμε την λίστα με τα πεδία από τους πίνακες
που βάλαμε παραπάνω
[STRINGS] SECTION
Τα strings είναι πινακάκια με λίστες ζευγαριών (κλειδί, τιμή)
(key,value). Αν τα καλέσουμε σαν Editor των πεδίων ενός πίνακα τότε θα
πάρουμε ένα drop down menu όπου θα βλέπουμε τις τιμές και εσωτερικά το
πεδίο θα πάρει το κλειδί.
Για κάθε ένα που θα ορίσουμε από κάτω θα δώσουμε τα ζευγάρια με την
λογική: κλειδί εσωτερικό = Τιμή εμφανιζόμενη
CONVERTER SECTION
Converter ΟνομαΜετατροπέα (Ονομα Πίνακα, 'Ονομα στήλης 1[=τιμή στήλης
1]; Ονομα στηλης Ν[=Τιμή στήλης Ν]', Ονομα στήλης που θα επιστραφεί.
πχ:
Converter ConvMtrLot (MTRLOT,'CODE;MTRL', MTRLOT);
Converter ConvCountry (COUNTRY, SHORTCUT,
COUNTRY);
Converter ConvCurrency (SOCURRENCY, SHORTCUT,
SOCURRENCY);
Converter ConvPayMent (PAYMENT, 'CODE;SODTYPE=13',
PAYMENT);
Converter Convtrdr (TRDR, 'COMPANY;CODE1;SODTYPE=12',
TRDR);
Converter ConvSupBranch (TRDBRANCH, 'CODE;TRDR',
TRDBRANCH);
Converter ConvService (MTRL, 'CODE;SODTYPE=52',
MTRL);
Converter ConvMtrl (MTRL, 'CODE1;SODTYPE=51',
MTRL);
Converter ConvSalesman (PRSN, 'COMPANY;CODE;SODTYPE=20',
PRSN);
Converter ConvWhouse (WHOUSE, 'COMPANY=1;WHOUSE;', WHOUSE);
Converter ConvVAT (VAT,
'PERCNT', VAT);
Converter ConvSeries (CCCSERIESMAPPING,
'otherscode;SOSOURCE=1351',softonecode);
Converter ConvPrjc (PRJC, 'COMPANY;CODE',
PRJC);
Converter ConvIncreace (CCCSERIESMAPPING,
'otherscode;SOSOURCE=1251',INCREASE);
Converter ConvFindoc (FINDOC, INT01, FINDOC);
Converter ConvCategory (MTRL, MTRL, MTRCATEGORY);

Ο μετατροπέας είναι έτοιμη συνάρτηση που εκτελεί ένα sql query στην
βάση και μας επιστρέφει την τιμή της στήλης που ζητήσαμε του πίνακα
που ζητήσαμε και σαν φίλτρο τις τιμές που του δώσαμε για τις στήλες
που του δώσαμε.
Τα φίλτρα είναι 2 ειδών: τα απλά και τα 'καρφωτά'. Τα 'καρφωτά' είναι
αυτά που δώσαμε με = στον ορισμό του μετατροπέα. Τα απλά θα πρέπει να
τα δώσουμε όταν τον χρησιμοποιήσουμε.
Τους μετατροπείς τους χρησιμοποιούμε με την λογική :
Variable = ConverterName(column1Value, ... , columnNValue);
Οι τιμές μπορεί να είναι σταθερές του προγράμματος, είτε άλλα
υπολογιζόμενα πεδία είτε πεδία από τις ερωτήσεις του import script.
CONNECTIONS SECTION
Connect Xplorer ServerData {
connect();
SqlDataSetName=Select sql statement;
SqlDataSetName2=Select sql statement;
SqlDataSetNameN=Select sql statement;
}
Μέσα από το script μπορούμε να συνδεθούμε σε διαφορετικές πηγές
δεδομένων (συνήθως άλλες βάσεις). Για να συνδεθούμε στην βάση του
softone χρησιμοποιούμε το παραπάνω (Connect Xplorer ΟνομαΣυνδεσης
{ connect(); } ).
Για να συνδεθούμε σε άλλες βάσεις (το παραπάνω είναι αναγκαίο να
υπάρχει ακόμη και αν δεν κάνουμε τίποτα στην Database του Softone που
τρέχουμε εκείνη την στιγμή):
Connect DBDriver OtherData {
// Driver DataBase ServerDB User Password
DataBaseName
//connect( 'XADODrv.bpl', 'oracle', 'orc1', 'atlantis', 'user',
'pass' );
// connect( 'XADODrv.bpl', 'MSSQL', 'nickxp', 'sa', 'pass',
'databasename' );
// Driver DataBase ServerDB User Password
DataBaseName
// oracle
//connect( 'XADODrv.bpl', 'oracle', 'ORC1', 'VAP', 'pass', 'orc1' );
//asa
//connect( 'XADODrv.bpl', 'CUSTOM', 'Provider=ASAProv.
90;Password=sql;Persist Security Info=True;User ID=dba;Data
Source=astraiatopanorama' );
// firebird interbase
connect( 'XADODrv.bpl', 'CUSTOM', 'Driver=Firebird/InterBase(r)
driver;Uid=SYSDBA;Pwd=masterkey; DbName=SMSERVER:C:\SHARED\MERCHANT
\SERVER.GDB;' );
// ms access
//connect( 'XADODrv.bpl', 'CUSTOM', 'Provider=MSDASQL.1;Persist
Security Info=False;User ID=sa;Data Source=MS Access Database' );
//mysql
connect( 'XADODrv.bpl', 'CUSTOM', 'Driver={MySQL ODBC 3.51
Driver};Server=192.168.1.100;Database=reflexis2;User=root;
Password=pass;Option=3;' );
}
Δηλαδή στο connect(); Διαμορφώνουμε την σύνδεση με τις άλλες βάσεις
που θέλουμε.
* ΠΡΟΣΟΧΗ: ΑΝ ΠΡΟΚΕΙΤΑΙ ΝΑ ΜΕΤΑΦΕΡΕΤΕ ΠΑΡΑΣΤΑΤΙΚΑ ΚΑΙ ΤΑ QUERIES ΘΑ
ΕΙΝΑΙ 2 (HEADER / DETAIL) ΑΠΟ ΑΛΛΕΣ ΒΑΣΕΙΣ:
Το Detail query, θα είναι γραμμένο έτσι ώστε να σας επιστρέφει την
πρώτη γραμμή του detail table 2 (δύο ) φορές
(Η πρώτη γραμμή αγνοείται από το Softone και για λόγους backward
compatibility σε παλιά script παραμένει)
Αν λοιπόν γράφετε ένα detail query θα γράψετε : select top 1 ... UNION
ALL SELECT ...;
Tο TOP 1 αλλάζει από βάση σε βάση οπότε πρέπει να ανατρέξετε στην
εκάστοτε βάση για το πώς θα φερετε 1 γραμμή και πως θα ενώσετε 2
select.
* Για mysql. Ο Driver MySQL ODBC 3.51 Driver έδειξε να έχει σωστή
συμπεριφορά με τα ελληνικά, ενώ ο 5.1 μας τα χαλούσε.
* Οι αναφορές στα πεδία των ερωτήσεων γίνεται με
το :ΟνομαΠίνακα.ΟνομαΣτήλης πχ:
AND TRNDATE BETWEEN :ImpTable.vDF AND :ImpTable.vDT
* Οι αναφορές στο header query γίνονται με το :
$HeaderDataSetName.ColumnName
* ΔΕΝ μπορούμε να αναφερθούμε απευθείας στα queries σε μεταβλητές
(variables) που έχουμε υπολογίσει στον κύριο κορμό του script (Main
Program). Για να πετύχουμε αυτό το αποτέλεσμα πρέπει να φτιάξουμε ένα
πεδίο στον πίνακα των ερωτήσεων που να κρατήσει την τιμή που θα
υπολογίσουμε, να την στείλουμε κατά την εκτέλεση του Main Program με
την SendResponse πριν να καλέσουμε την import συνάρτηση.
* Αν έχουμε ένα query που βολεύει να είναι header για πολλά άλλα
detail queries, ΔΕΝ μπορούμε να το χρησιμοποιήσουμε σε περισσότερους
συνδυασμούς import (το script θα σταματά με μήνυμα λάθους). Έστω κι αν
είναι πανομοιότυπο πρέπει να έχει διαφορετικό όνομα για να
χρησιμοποιηθεί και σε δεύτερο import κομμάτι.
IMPORT SECTION
Το κομμάτι import είναι το κομμάτι που ορίζουμε την εισαγωγή δεδομένων
στα objects του softone. Συνήθως επειδή υπάρχει πληθώρα παραδειγμάτων
για όλα τα βασικά objects της εφαρμογής, δεν χρειάζεται να τα γράφουμε
από την αρχή. Βρίσκουμε ένα από κάποιο παράδειγμα και το τροποποιούμε
στις δικές μας ανάγκες. Αν παρόλα αυτά δεν βρήκατε παράδειγμα ένας
εύκολος τρόπος να ξεκινήσετε είναι να ανοίξετε την εργασία που θέλετε
να κάνετε import. Αν μπορείτε να δείτε τον σχεδιασμό προβολής, μέσα
εκεί τόσο στα πεδία, όσο και στην παραμετροποίηση υπάρχουν τα ονόματα
των πινάκων που χρησιμοποιεί το object. Δεν χρειάζονται όλοι να
γεμίσουν φυσικά, μόνο αυτοί που θα γεμίζαμε εμείς με το χέρι. Αν δεν
έχουμε τον σχεδιασμό προβολής τότε μπορούμε να χρησιμοποιήσουμε τον
συνδιασμό πλήκτρων Ctrl + Shift + F12, σε κάθε πεδίο που θέλουμε να
συμπεριλάβουμε στο import, θα εμφανιστεί ένα παράθυρο με όλες τις
διαθέσιμες πληροφορίες που χρειαζόμαστε για το πεδίο.
Σύνταξη:
Import ΟνομαΣυνάρτησηςΕισαγωγής(dataset1, dataset2, ...datasetN) into
'OBJECTNAME,parameters'
{
OBJECTTABLE1 dataset1
{
COLUMNNAME = dataset1.ANTISTOIXOCOLUMN;
....
Καθώς και οποιαδήποτε δήλωση/ αλλαγή μεταβλητής, και λογική με
if / else για να στείλουμε στο OBJECTTABLE τις σωστές τιμές στα πεδία.
}
...
OBJECTTABLEΝ datasetN
{
COLUMNNAME = datasetN.ANTISTOIXOCOLUMN;
....
Καθώς και οποιαδήποτε δήλωση/ αλλαγή μεταβλητής, και λογική με
if / else για να στείλουμε στο OBJECTTABLE τις σωστές τιμές στα πεδία.
}
}
Περιπτώσεις τύπου VATANAL, EXPANAL δηλώνονται
VatAnal sVatAnal ('VAT','VAT') {
VAT = sVatAnal.VAT;
VATVAL = sVatAnal.VATVAL;
// LSUBVAL = sVatAnal.SUBJECTTOVALUE;
LVATVAL = sVatAnal.VATVAL;
}
Δηλαδή έχουν και το ('VAT','VAT') .
Σε αυτές τις περιπτώσεις πρέπει το πεδίο VAT να μας έρχεται από το
query και να μην βάλουμε converter για να το δώσουμε (ευτυχώς τα ΦΠΑ
είναι λίγα και ένα case μέσα στο select query είναι αρκετά εύκολο και
γρήγορο)
* 'καρφωτές τιμές'. Σε περίπτωση που θέλετε να έχετε τις τιμές που
φέρνετε από τα queries και όχι αυτές που θα υπολογίσει το Softone τότε
δηλώνετε πρώτα τα πεδία και μετά χρησιμοποιείτε το NOTCALC=1;
SALDOC sSALDOC {
NOTCALC=1;
TURNOVR = sSALDOC.DOC_Net_Value;
TTURNOVR = sSALDOC.DOC_Net_Value;
LTURNOVR = sSALDOC.DOC_Net_Value;
VATAMNT = sSALDOC.DOC_Vat_Value;
TVATAMNT = sSALDOC.DOC_Vat_Value;
LVATAMNT = sSALDOC.DOC_Vat_Value;
NETAMNT = sSALDOC.DOC_Net_Value;
TNETAMNT = sSALDOC.DOC_Net_Value;
LNETAMNT = sSALDOC.DOC_Net_Value;
SUMAMNT = sSALDOC.DOC_Gross_Value - sSALDOC.DOC_Total_Discount +
sSALDOC.DOC_Vat_Value;
SUMTAMNT = sSALDOC.DOC_Gross_Value - sSALDOC.DOC_Total_Discount +
sSALDOC.DOC_Vat_Value;
SUMLAMNT = sSALDOC.DOC_Gross_Value - sSALDOC.DOC_Total_Discount +
sSALDOC.DOC_Vat_Value;
}

Ότι γραφεί μετά το NOTCALC=1; Παίρνει την τιμή που του δίνουμε και όχι
αυτή που υπολογίζει το softone.
Parameters:
,IMPORT την συναντούμε συνήθως σε objects παραστατικών πχ SALDOC,
PURDOC. Πιθανών και να μην χρειάζεται αλλά όπου την βρω την αφήνω.
,IMPORT:1 Ανάλογα με το στήσιμο που έχουμε κάνει στις σειρές των
παραστατικών, για κάποια βολεύει η σκέτη και για κάποια άλλα αυτή με
το :1. Γενικά αν κάποιες φορές δούμε ότι η σκέτη βγάζει μηνύματα λαθών
αυτή με το :1 παίζει κανονικά αλλά και το αντίθετο.
,T Ίσως η πιο δυνατή παράμετρος από όλες. Αν όλα πάνε καλά (χωρίς
λάθη), τότε η εγγραφή που μόλις περάσαμε θα εμφανιστεί στην οθόνη ενώ
το script θα περιμένει να πατήσουμε είτε καταχώρηση, είτε ακύρωση. Αν
θέλουμε να εκτυπώνετε τότε πρέπει να θέσουμε στην σειρά είτε αυτόματη
εκτύπωση είτε με ερώτηση ναι. Αυτό γιατί κατά την καταχώρηση το
παράθυρο της εγγραφής θα κλείσει και το script θα συνεχίσει στην
επόμενη εγγραφή
,FORM:Όνομα Προβολής Σε συνδυασμό με την παραπάνω κάνει τα ίδια με
την παραπάνω αλλά μπορούμε να διαλέξουμε και με ποια σχεδιαζόμενη
προβολή να ανοίξει η εγγραφή.
,WARNINGS:OFF Απενεργοποιεί τα προειδοποιητικά μηνύματα που πιθανών
να παίρναμε αν καταχωρούσαμε την εγγραφή με το χέρι.
Μπορούμε να βάλουμε στη σειρά χωρισμένες με κόμμα όσες παραμέτρους
χρειαζόμαστε.
VARIABLES SECTION
Σύνταξη:
Var ΟνομαΜεταβλητής1, ΟνομαΜεταβλητής2, ...., ΟνομαΜεταβλητήςΝ;
Εδώ ορίζουμε τις μεταβλητές που θα χρησιμοποιήσουμε στο import section
και στο Main Program. Όπως αναφέραμε και παραπάνω δεν μπορούμε να
χρησιμοποιήσουμε μεταβλητές στο Connect Section.
Οι μεταβλητές είναι κατά τον ορισμό του Javascript, δεν έχουν τύπο, το
αρχικό όρισμά τους καθορίζει και τον τύπο τους. Αν πάμε να κάνουμε
πράξεις πάνω τους και η πράξη δεν ανταποκρίνεται σε σοβαρό αποτέλεσμα
τότε το script θα βγάλει μήνυμα λάθους της μορφής Cannot Convert
variable of Type1 to Type2. Σε αυτή την περίπτωση να θυμάστε ότι το
Type1 είναι συνήθως στην γραμμή του λάθους πιο δεξιά γραμμένο από το
Type2 (το οποίο θα είναι αριστερά του Type1).
VarArray (value1, value2, ...valueN, N);
Με τον πάνω τρόπο ορίζουμε ένα Array μεταβλητών που συνήθως
χρειαζόμαστε στις εντολές που χειρίζονται SQL Queries στην βάση
δεδομένων. Η αναφορά από τα queries στις μεταβλητές γίνεται με το :
1 , :2 , ... :N
Προσοχή: Στα queries που γράφουμε τα :1 , :2 , ... :N , τα νούμερα δεν
καθορίζουν την σειρά των value1, value2, ...valueN. Θα πρέπει να είναι
ΠΑΝΤΑ ΜΕ ΤΗΝ ΣΕΙΡΑ ΠΟΥ ΕΜΦΑΝΙΖΟΝΤΑΙ ΣΤΟ QUERY ΑΣΧΕΤΑ ΜΕ ΤΟΝ ΑΡΙΘΜΟ ΠΟΥ
ΤΟΥΣ ΕΧΟΥΜΕ ΔΩΣΕΙ. Αν δηλαδή χρειαστεί να γράψουμε κάτι επιπλέων στο
query και πρέπει να παρεμβάλλουμε έναν αριθμό, δεν μπορούμε. Θα πρέπει
να γράψουμε τους αριθμούς ξανά με την σειρά και τις μεταβλητές με την
σειρά εμφάνισης των παραμετρικών πεδίων.
FUNCTIONS SECTION
Εδώ μπορούμε να ορίσουμε συναρτήσεις που είτε επιστρέφουν τιμές με την
return είτε όχι. Τις συναρτήσεις τις καλούμε από το Main Program. Αν
έχουμε επανάληψη κάποιου κώδικα μέσα στο Main Program καλό θα ήταν να
γράφαμε το επαναλαμβανόμενο τμήμα σε μια function και να την καλούσαμε
όσες φορές χρειαζόταν. Για τους λάτρεις του αντικειμενοστραφή
προγραμματισμού, γράφτε όσο το δυνατόν περισσότερες functions
μπορείτε, βολεύει σε περιπτώσεις code reuse και copy paste.

Μερικά παραδείγματα:
function addMemoLine(memo, line) {
memo = memo + VarToStr(line) + #10; // normal flow - latest at
the end of memo
//memo = VarToStr(line) + #10 + memo; // reverse flow - latest at
the beginning of memo
return memo;
}

function addMemoLineDisplay(memo, line) {
memo = addMemoLine(memo, line);
var x;
x = SendResponse(memo, 'ImpTable.vImpMess');

// var vImpTable;
// vImpTable=CallPublished('ModuleIntf.GetDataSet',VarArray
(XModule,'ImpTable',2));
// x = CallPublished('ModuleIntf.DataSetEdit',vImpTable);
// x = CallPublished('ModuleIntf.SetFieldValue',VarArray
(vImpTable,'vImpMess',memo,3));
// x = CallPublished('ModuleIntf.DataSetPost',vImpTable);

return memo;
}


function IsEmpty(str)
{
return (Len(Trim(str)) = 0);
}

function NotIsEmpty(str)
{
return (Not(IsEmpty(str)));
}

MAIN PROGRAM
Εδώ γράφουμε όσα πρέπει να γίνουν όταν ο χρήστης πατήσει το πλήκτρο
Εκτέλεση.
Η ροή του προγράμματος γίνεται γραμμή-γραμμή, αν και μπορούμε να την
σταματήσουμε χρησιμοποιώντας την RaiseException(Message: string).
Συνήθως εκτός από το πλήκτρο εκτέλεση επιβάλλουμε στον χρήστη να
τσεκάρει ένα Τσεκ κουμπί για να εκτελέσει την όποια εργασία κάνει το
script. Ειδικά αν το script κάνει πολλές εργασίες και ο χρήστης θέλει
να κάνει μόνο μια από αυτές τότε του επιβάλλουμε να διαλέξει την/ τις
εργασίες που θέλει να κάνει με το script.
Για τον λόγο αυτό συνήθως όλο το Main Program είναι της μορφής
if (κουμπιΑ_Τσεκαρισμένο=1)
{
εργασία για το κουμπιΑ;
}
if (κουμπιΒ_Τσεκαρισμένο=1)
{
εργασία για το κουμπιΒ;
}
Με τον τρόπο αυτό δομούμε καλύτερα και τον κώδικα, κάνοντας τον να
θυμίζει fire_event_procedures.
Η βασική εντολή του Main Program είναι η fetch.
Συνταξη:
fetch dataSetName {
//ότι γράψεις εδώ θα γίνει για κάθε γραμμή που επιστρέφει το dataset,
κάθε πεδίο είναι διαθέσιμο με την μορφή dataSetName.ColumnName
Εδώ καλούμε και τις συναρτήσεις import με ορισματα το dataSetName και
τα τυχόν άλλα datasets που χρειαζόμαστε για το import. Τα DatasetName
να είναι τα ίδια τόσο στο connect section, στο import section και στο
Main Program
}
Την fetch για το ίδιο dataset μπορούμε να την καλέσουμε παραπάνω από
μία φορές. Έτσι την πρώτη φορά μπορούμε να την χρησιμοποιήσουμε για να
μετρήσουμε πόσες εγγραφές θα φέρει και να βάλουμε το νούμερο στις
συνολικές εγγραφές, και μετά να την ξαναφέρουμε για να εκτελέσουμε το
import.
Fetch μέσα σε fetch γίνεται, αλλά δεν γίνεται import μέσα στο δεύτερο
fetch (μόνο στο πρώτο).
Ο περισσότερος κώδικας σε ένα συνδυασμό fetch / import είναι η
διαχείριση του λάθους.
Οι μεταβλητές που έχουμε στην διάθεσή μας είναι οι
(ImportError = 0 and ResultNum > 0)
Η ImportError είναι διαφορετική από το 0 όταν υπήρξε λάθος στο import
στην γραμμή του fetch, ενώ είναι μηδέν αν όλα πήγαν καλά. Η ResultNum
επιστρέφει το ID της εγγραφής που καταχωρήθηκε από την τελευταία
import συνάρτηση. Αν για παράδειγμα περνούσαμε παραστατικά θα είχαμε
το FINDOC.FINDOC, αν περνούσαμε πελάτες το TRDR.TRDR κλπ.
Ένα τυπικό παράδειγμα fetch / import :
x=ExecSQL('ServerData', 'delete from imperrors where company = :1 and
somodule = '+#39+'SALDOC'+#39, VarArray(:x.sys.company,1) ); //σβήσε
προηγούμενα λάθη για να μπορέσω να γράψω τα καινούρια. Οπωςδήποτε να
υπάρχει αλλιώς θα δημιουργήσει πρόβλημα στην παρακάτω ExecSQL εντολή.

fetch sPURDOC { //ξεκινάμε να φέρνουμε γραμμή γραμμή τα παραστατικά
αγορών
ImpPurchases(sPURDOC, sIteLines, sVatAnal); //
εκτελούμε την συνάρτηση import
if (ImportError=0) vRow=vRow+1; //αν όλα πήγαν
καλά μέτρα μια παραπάνω εγγραφή
else { vRowCancel=vRowCancel+1; // αλλιώς:
μέτρα μια παραπάνω άκυρη εγγραφή
vErrors=vErrors+ErrorMessage; //φέρε μαζί
με τα λάθη που κουβάλησες από το import
//και το
μήνυμα που λέει το softone.
x=ExecSQL('ServerData', 'insert into
imperrors (imperrors,company,somodule,soerrors) values ( :1, :2, :3, :
4 )', VarArray(vRowCancel,:x.sys.company,'SALDOC',vErrors,4) );
//γράψε στην βάση για το λάθος για να μπορέσουμε να καταλάβουμε τι
συνέβει αργότερα
vErrors=''; //πριν πας στην επόμενη
εγγραφή σβήσε ότι λάθος είχε η τρέχουσα
}
UserResp=SendResponse(vRow, vRowCancel,
'RESULTS.CURREC;RESULTS.CANREC');
//δείξε στην οθόνη πόσες εγγραφές καλές και άκυρες έχουμε μέχρι τώρα
πριν πάμε στην επόμενη γραμμή
}
CALLPUBLISHED SECTION
H CallPublished είναι η μεγάλη εξέλιξη στα import script. Με αυτήν
μπορείς όχι μόνο πια να εισάγεις στοιχεία από άλλες πηγές αλλά και να
αλλάζεις/διαχειρίζεσαι /τροποποιείς τις ήδη υπάρχουσες εγγραφές.
Μέχρι στιγμής έχουμε ανακαλύψει (από διάβασμα πολλών import script)
τις παρακάτω
Σιγά σιγά μπορούμε να γράφουμε τα ορίσματα και το τι μας δίνει η κάθε
μια , αλλά και να γράψουμε και όλες τις καινούριες
PILib.DeleteFile
PILib.FileExists
PILib.OpenText
PILib.Eof
PILib.ReadLine
PILib.CloseText
PILib.WriteLine
PILib.CreateText
PILib.AnsiToUTF8
PILib.UTF8ToAnsi ??
PILib.GetQueryResults
PILib.GetQueryData

ProgLibIntf.GetDefaultBranch ?? S1group\S1email\CreatePurOrders.imp

ModuleIntf.CreateSupportModule
ModuleIntf.InsertModule
ModuleIntf.CreateModule
ModuleIntf.LocateModule
ModuleIntf.GetDataSet
ModuleIntf.DataSetRecordCount
ModuleIntf.DataSetDelete // delete current (?) record
ModuleIntf.DataSetFirst //Πρώτο Record του Dataset
ModuleIntf.DataSetEof
ModuleIntf.DataSetEdit
ModuleIntf.DataSetInsert
ModuleIntf.DataSetAppend
ModuleIntf.DataSetLocate
ModuleIntf.GetFieldValue
ModuleIntf.SetFieldValue
ModuleIntf.DataSetPost
ModuleIntf.DataSetNext
ModuleIntf.PostModule
ModuleIntf.DestroyModule
ModuleIntf.DestroySupport

SysRequest.Evaluate
SysRequest.DeleteRecord
SysRequest.RequestEdit ??
SysRequest.ExecMenuItem ?? Infosector\OpenCustomer.imp
SysRequest.ProcessMessages ??
SysRequest.GetFormModule
SysRequest.GetQuestionsDataSet
SysRequest.ControlClick ??

CompressObj.DecompressTable

MerginIntf.CreateExport
MerginIntf.ExportData
MerginIntf.ResetStream
MerginIntf.ImportData
MerginIntf.CloseImport
MerginIntf.OpenSupportFile

AcnDocIdxFunc.GetQueryData
AcnDocIdxFunc.GetQueryValue
AcnDocIdxFunc.FStrToFloat ??

On 10 Νοέ, 13:08, vangelis pistolas <vangelispisto...@yahoo.gr> wrote:
> Ξέρει κανείς που υπάρχει documentation για τις συναρτήσεις της S1 Batch Script Language (SBSL); Έχω βρει κάτι αλλά δεν τεκμηριώνονται όλες οι συναρτήσεις. Π.χ.
> 1. Converter ConvItem (MTRL, 'COMPANY;CODE;SODTYPE=51', MTRL);
> 2. Module=CallPublished('ModuleIntf.CreateModule','SALDOC,WARNINGS:OFF');
> 3. x=CallPublished('ModuleIntf.LocateModule',VarArray(Module,sItem.FINDOC,2));

> 4. x=CallPublished('ModuleIntf.DataSetLocate',VarArray(vIteLines,'MTRL;MTRLINE-S',VarArray(sItem.MTRL,sItem.MTRLINES,2),3));


>
> Δεν έχω βρει κάτι για αυτές καθώς για τις παραμέτρους τους που δηλώνονται σαν VarArray
>
> Ευχαριστώ
>

> ___________________________________________________________
> Χρησιμοποιείτε Yahoo!;
> Βαρεθήκατε τα ενοχλητικά μηνύματα (spam); Το Yahoo! Mail

Κώστας Βάππας

unread,
Nov 17, 2009, 3:53:53 AM11/17/09
to Softone Developers Network
Δείτε στο forum και το σεμινάρια.rar
Ιδίως το Test1.imp

> connect( 'XADODrv.bpl', 'CUSTOM', 'Driver=Firebird/InterBase(r) ...
>
> διαβάστε περισσότερα »

Kostas Providas

unread,
Jan 8, 2010, 11:53:23 AM1/8/10
to Softone Developers Network
Καλησπέρα,
Μήπως ξέρει κανένας γιατί μου χτυπάει η NONCALC=1; ( undeclared
identifier ) παραθέτω δείγμα script:

Import ImpSpTrans(sDoc,sLines) into 'LINSUPDOC,IMPORT:1'
{
Findoc sDoc
{
SERIES = sDoc.Series;
Fincode = sDoc.tradecode;
Trndate = sDoc.ftrdate;
TRDR = ConvSupplier(:x.sys.company, sDoc.supcode);
vErrors = ' Παραστατικό: ' + VarToStr
(sDoc.tradecode);
}

LINLINES sLines
{
MTRL = ConvItem(:x.sys.company, sLines.VCTID);
LINEVAL = sLines.LineValue;
NONCALC=1;
if(LINLINES.VAT<>0) VATAMNT = sLines.fpa;
}

}
Όταν κάνω comment την NOCALC όλα καλά. Ζητούμενο είναι η εισαγωγή
ειδικών συναλλαγών προμηθευτών από xline και δεν θέλω να υπολολογίζει
το Softone τον ΦΠΑ.

Ευχαριστώ!

Κωνσταντίνος Βάππας

unread,
Jan 8, 2010, 12:21:48 PM1/8/10
to so...@googlegroups.com
Για δοκίμασε NOCALC:1

--
Softone Developers Network group.
To post to this group, send email to so...@googlegroups.com

Κώστας Προβίδας

unread,
Jan 8, 2010, 5:36:05 PM1/8/10
to Softone Developers Network
Ευχαριστώ για την άμεση απάντηση!
Το script είναι αυτό:
Import ImpSpTrans(sDoc,sLines) into 'LINSUPDOC,IMPORT:1,WARNINGS:OFF'

{
Findoc sDoc
{
SERIES = sDoc.Series;
Fincode = sDoc.tradecode;
Trndate = sDoc.ftrdate;
TRDR = ConvSupplier(:x.sys.company, sDoc.supcode);
vErrors = ' Παραστατικό: ' + VarToStr
(sDoc.tradecode);
}

LINLINES sLines
{
MTRL = ConvItem(:x.sys.company, sLines.VCTID);
LINEVAL = sLines.LineValue;

NOTCALC = 1;


if(LINLINES.VAT<>0) VATAMNT = sLines.fpa;
}
}

Έχω δοκιμάσει NOTCALC=1, NOCALC=1, NONCALC=1, & με (:) άνω κάτω τελεία
αλλά δεν κατάφερα τίποτα. Παρατήρησα όμως οτι όταν το object είναι το
PURDOC το NOTCALC=1 λειτουργεί. Τι μπορεί να συμβαίνει;

Καλό ΣΚ!

On 8 Ιαν, 19:21, Κωνσταντίνος Βάππας <vappaskonstanti...@gmail.com>
wrote:


> Για δοκίμασε NOCALC:1
>
> Στις 08 Ιανουαρίου 2010 6:53 μ.μ., ο χρήστης Kostas Providas <

> webco...@gmail.com> έγραψε:

> > To post to this group, send email to so...@googlegroups.com- Απόκρυψη κειμένου σε παράθεση -
>
> - Εμφάνιση κειμένου σε παράθεση -

Reply all
Reply to author
Forward
0 new messages