<< Click to Display Table of Contents >> Navigation: WinArhi > Fereastra principala > Oferte si Comenzi deschise > Meniu > Optiuni > Editare Script funcții |
Atenție! Dacă o funcție din script întoarce False (valoarea implicită) toate funcțiile care urmează în listă vor fi anulate!
!!! Pentru oțel, este obligatoriu ca denumirea funcției să înceapă cu textul Otel, iar lungimea (Length) va fi calculată automat în funcție de câmpul C_Otel. Se poate introduce zero sau orice altă valoare în câmpul Length, aceasta fiind ignorată.
Daca o functie din script este de tip "Functie pentru otel", si in ea se foloseste WA_AddCutItem(CodOtel, 0), o sa adauge CodOtel cu dimensiunea otelului. Pentru ca WinArhi sa "lege" armatura de profil si sa apara la dimensiuni de debitare, numele functiei trebuie sa inceapa cu "Otel", de exemplu: function OtelAdaugaArmaturaCCV: Boolean
Indentarea la stănga și la dreapta a unui bloc de text inserat se face cu Ctrl+K+U și Ctrl+K+I.
Variabile care pot fi declarate in script:
Val: TFuncScriptVal;
BlockSaveMsg: String; //daca este completata va bloca salvarea ofertei
BlockReportsMsg: String; //daca este completata va bloca rapoartele
ErrorMsg: String;
WarnMsg: String;
ReportsMsg: String; //valorile completate aici, cumulate pe cate o linie noua per fereastra, vor aparea in campul ReportsMsg din tabelul Ofertare din rapoarte.
Valori accesibile prin obiectul Val (exemplu: Val.Left):
TFuncScriptVal = class
Left, Right, Up, Down: Integer; //lungimile de falț la feronerie și dimensiunile ochiului în care se află profilul pentru profile
LeftActive, RightActive, UpActive, DownActive: Integer; //lungimile de falț (doar la feronerie)
ActiveHandleHeight: Integer;//înăltimea de jos de la falț (doar la feronerie)
HandleSideLength: Integer;//falțul pe latura mânerului (indisponibil la domeniul XY al setului) (doar la feronerie, în set și pe piesă)
RabbeteLength: Integer;//falțul pe latura pe care este pusă piesa de feronerie
ActiveEspagCode: String; //codul mecanismului activ (sau broasca)
InactiveEspagCode: String;//codul mecanismului de stulp
LeftInactive, RightInactive, UpInactive, DownInactive: Integer; //lungimile de falt
//Daca apelul vine de la un articol de feronerie si acesta este pozitionat pe o latura, atunci este codul acelei laturi
SashPrHeight: Double; //(doar la feronerie)
SashPrWidth: Double; //(doar la feronerie)
SashCode: String; //(doar la feronerie)
//Frame este tocul, bandoul sau pragul. Poate fi și cerceveaua in care este o cercevea dacă este cercevea in cercevea.
//Daca apelul vine de la un articol de feronerie si acesta este pozitionat pe o latura, atunci este codul acelei laturi
FramePrHeight: Double;
FramePrWidth: Double;
FrameCode: String;
{TTipProfilSimplu = (
Nedeterminat = 0,
Toc = 1,
Prag = 2,
Ccv = 3,
Bandou = 4,
Stulp = 5,
Otel = 6,
Lacrimar = 7,
AdausToc = 8,
Imbinare = 9,
Bagheta = 10, //RO_tpSipca
SupBagheta = 11, //RO_tpPrSupSipca
SprosInt = 12,
SprosExt = 13}
FrameType: Integer;//TipProfilSimplu
DownFrameCode: String;
ThresholdCode: String;
LeftFrameCode: String;
LeftFrameType: Integer;//TTipProfilSimplu
OrderPrSeries: String;
OrderPrSubSeries: String;
PrSeries: String;
PrSubSeries: String;
PrType: Integer;//TipProfilSimplu
PrBaseColor: String;
PrBaseColorCode: String;
PrBaseColorCategory: String;
PrIntAplColor: String;
PrIntAplColorCode: String;
PrExtAplColor: String;
PrExtAplColorCode: String;
PrRabbetAplColor: String;
PrRabbetAplColorCode: String;
PrExtPlatingColor: String;
OutOpening: Boolean;//identic cu OutsideOpening
OutsideOpening: Boolean;//la feronerie este al cercevelei iar in rest al ferestrei. Dacă fereastra nu are cercevele atunci ține cont dacă a fost bifat la creare ca este cu deschidere exterior.
ProfilesInFrameAreTurned: Boolean;//v12 inversarea tocului si bandourilor in functie de deschiderile exteriorare, interioare si ochiurile fixe din toc (de asemenea daca profilul are bagheta pe interior sau exterior)
WindowHardwareColor: String;
HardwareColor: String;
HardwareFixedColor: String;
ArticleColor: String;
HasFalseMullion: Boolean;//doar la feronerie si la profilele de cercevea
MullionTooCloseToTheHandle: Boolean;//in special pentru feronerie dar poate fi folosit si la cercevea
WeightGr: Integer; //greutatea termopanului. La feronerie si profile. In cazul profilelor este greutatea geamurilor din ochiul in care se afla profilul.
KgPerSqm: Double; //greutatea termopanului (doar la feronerie)
OpeningMark: String; //doar la feronerie si profilul de cercevea
OpeningType: String;//doar la feronerie si profilul de cercevea
OpeningTypeList: String;//pentru bandou este o listă separată cu virgulă a tuturor deschiderilor care pică pe acel profil de unde se apelează. Pentru toc contine toate deschiderile din acel toc.
OpeningSet: String;//doar la feronerie si profilul de cercevea
ActiveOpeningSet: String; //doar la feronerie si profilul de cercevea
HasActiveOpening: Boolean; //doar la feronerie și la profilele de cercevea
FalseMullionCode: String; //doar la feronerie și la profilele de cercevea
DrainageCapsCode: String; //doar la feronerie
WindowType: String;//intoarce "Window", "Door" sau "BalconyDoor"
//Pentru functiile apelate din profile
PrLength: Double;
PrLength_Int: Double; //lungimea la interior (bagheta)
PrPosition: Integer; //ProfilePosUp, ProfilePosDown, ...
PrWithHinge: Boolean;
PrWithDoorHinge: Boolean;
PrWithMullionOnIt: Boolean;
PrArchHeight: Double;//ia și valori negative pentru bolta în interior
PrArchRadius: Double;
PrAngle1: Double;//unghi debitare 1
PrAngle2: Double;//unghi debitare 2
PrWeld1: Boolean;
PrWeld2: Boolean;
//de tip "array of Double", în sensul acelor, doar bandouri, fără ștulp
//Pentru a putea fi citite valorile listei, aceasta va trebui copiată într-o altă variabilă de tip "array of Double" sau "Variant"
//de ex. Cote := Val.PrAllMullionPositions și se va folosi variabila Cote și nu Val.PrAllMullionPositions
PrAllMullionPositions: Variant;
End1OnArch: Boolean;
End2OnArch: Boolean;
OfferArchCount: Integer;
OfferWindowsQty: Integer;
WindowQty: Integer;//numărul de ferestre final (înmulțit deja cu PanelQty)
PanelQty: Integer;//numărul de panouri
CallerQty: Double;//cantitatea totală (înmulțit deja cu CallerPcs); la profile este lungimea totală
CallerPcs: Double;//la profile este numărul de bucăți de profil
CallerPos: Integer;//TPozitieProfilSDSJ = (ppNu=0, ppSus=1, ppJos=2, ppSt=3, ppDr=4)
CallerCode: String;
SquareHasArch: Boolean;
//Profilul de baza (primul) de la care a pornit apelul functiilor
BasePrCode: String;
BasePrType: Integer;//TTipProfilSimplu
BasePrWidth: Double;
BasePrHeight: Double;//C_Total
BasePrTotalDim: Double;//C_Total
BasePrTotalInternalHeight: Double;//C_Int + C_Buza
//Doar pentru functiile folosite la termopane
GlassHeight: Double;
GlassWidth: Double;
InstallationType: String;// Tip montaj
WithInstallation: Boolean;
//Functii care necesita functia FuncListaOtelCcv
SashSteelCode(Index: Integer): String;//v12 (doar la feronerie, Index incepe de la 0, articolul de feronerie care apelează trebuie să fie poziționat pe o latură de unde se va verifica armatura)
FrameSteelCode(Index: Integer): String;//v12 (doar la feronerie, Index incepe de la 0)
//TPozitieProfilSDSJ = (ppNu=0, ppSus=1, ppJos=2, ppSt=3, ppDr=4)
//Pentru pozitia implicita ppNu=0 va cauta la profilul curent, altfel va cauta la profilul din pozitia ceruta din ochiul in care se afla profilul de unde se apeleaza
SteelCode(Index: Integer; PrPosition: TPozitieProfilSDSJ = ppNu): String;//v13 (nu functioneaza la feronerie, Index incepe de la 0)
//grosimea maxima a geamurilor care pica pe profilul care apeleaza
//daca nu este apelata de un profil atunci va intoarce pentru toate termopanele ferestrei
MaxGlassThickness: Integer;
GlassTableField(const AFieldN: String): Variant;//se poate citi orice câmp, specificat în AFieldN, din tabelul de termopane al termopanului din ochiul curent
//v13.0.57 initial este setata cu valoarea stabilita conform tabelelor
//va fi folosit doar pentru a scrie din script numarul de zile de livrare pentru articolul apelant
SupplyTerm: Integer;
MinOrderQty: Double;//v13.0.71 poate fi setată în scriptul funcției al carei nume este completat in câmpul FunctieTermenAprovizionare pentru a aduce cantitatea per comanda la o valoare minimă după optimizarea pentru consum
OptimizationNeeded: String;//v15.0.57 poate fi setată în scriptul funcției al carei nume este completat in câmpul FunctieTermenAprovizionare pentru ajusta câmpul OptiPtConsum
WindowUfValue: Double;//v14 Este tot timpul 0 și poate fi setată în scriptul oricarei functii. Valoarea se va folosi pentru toate profilele ferestrei și va intra în calculul transmitanței termice Uw a ferestrei.
SquareRemark: String; //observațiile ochiului
DelivCountry: String;
DelivDistKm: Integer;
WindowWeightKg: Double;
PanelWeightKg: Double;
HasAdditionalProfilesWithWeldingOnFrame: Boolean;
HardwareItemQty(ItemCode: String): Double;//apelabil de la articolele de feronerie si cercevea
HardwareItemTypeQty(ItemType: String; OnlyOnTheCallerProfile: Boolean = False): Double;//apelabil de la articolele de feronerie, cercevea, toc/bandou (fara bandouri din cercevea) sau termopan. Pentru "Blocator" însumează și ceea ce găsește pe coloana CoduriBlocatori fără a mai verifica dacă aceștia sunt marcați ca "Blocator".
Dacă este apelat de pe un profil de cercevea sau toc/bandou atunci se poate folosi și OnlyOnTheCallerProfile.
InSash: Boolean;//întoarce True dacă este apelată dintr-o cercevea
SashWeight: Double //Greutatea completa a cercevelei. Disponibil pentru articolele de feronerie feronerie, nu in setul de feronerie. Cercevelele în cercevea nu sunt luate in calcul.
//Pozitiile badourilor, pieselor de feronerie si blocatorilor
Positions(AIndex: Integer): Double;//cota in milimetrii invers acelor de ceas pe profilul debitat (fara buza tocului)
PositionsType(AIndex: Integer): Integer;//TTipLegT = (tltBandou = 0, tltBlocator = 1, tltPiesaFero = 2)
WindowDoorPanel: TWAWindowDoorPanel; //Pozitia din ofertă (fereastră sau panou). Dacă este apalată de la o fereastra din panou va fi panoul.
WindowDoor: TWAWindowDoors;
Panel: TWAWindowDoorPanel; //Pozitia din ofertă (panou). Apalată de la ferestrele simple va fi NIL iar de la cele din panou va fi panoul.
Square: TWASquare;//ochiul
//Latura (la îmbinarile de colț este latura a doua în sensul acelor)
//În cazul profilelor de adaus toc Val.Side este al tocului
Side: TWASide;
FrameSide: TWASide;//latura tocului/bandoului pe care pică profilul care apelează (la îmbinarile de colț este latura a doua în sensul acelor)
WAOrder: TWAOrder;//latura tocului/bandoului pe care pică profilul care apelează (la îmbinarile de colț este latura a doua în sensul acelor)
end;//TFuncScriptVal
Declaratia obiectului care reprezinta o latura
TWASide = class
property Angle: Double;//unghi cu latura stanga (la tangenta in cazul boltei). Reprezintă unghiul complet și nu cel de debitare.
property Angle2: Double;//unghi cu latura dreapta...
function Length: Double;
property LeftSide: TWASide;//latura stânga în sensul acelor
property RightSide: TWASide;//latura dreapta in sensul acelor
end;
Declaratia obiectului care reprezinta un ochi
TWASquare = class
function LeftTopSquare: TWASquare;
function LeftBottomSquare: TWASquare;
function RightTopSquare: TWASquare;
function RightBottomSquare: TWASquare;
function Frame: TWAFrame;
function BaseParentFrame: TWAFrame; //rama (cerceveaua) în care este ochiul
function ParentFrame: TWAFrame;
function ParentSquare: TWASquare;
function ParentWindow: TWAWindowDoor;
function LightWidth: Double; //lungimea la cota de lumina
function LightHeight: Double;
function InternalWidth: Double; //lungimea la cota de interior (baghetă)
function InternalHeight: Double;
function GlassWidth: Double;
function GlassHeight: Double;
function GlassWeightGramPerSqm: Double;
function GlassThickness: Integer;
//numara cu RO_ProfilT(), adica si SprosT dar nu intra in cercevele
function NumberOfMullions: Integer;
function NumberOfFalseMullions: Integer;
function SashBarsIntColour: String;
function SashBarsIntColourCode: String;
function SashBarsIntColourCategory: String;
function SashBarsExtColour: String;
function SashBarsExtColourCode: String;
function SashBarsExtColourCategory: String;
property OpeningType: String read GetOpeningType;//OBD, OBS....
property OpeningMark: String read GetOpeningMark;
property OpeningSet: String read GetOpeningSet;
function LeftPrCode: String;
function RightPrCode: String;
function TopPrCode: String;
function BottomPrCode: String;
end;
Declaratia obiectului care reprezinta o rama (toc sau cercevea)
TWAFrame = class
function Width: Double;
function Height: Double;
function LeftPrCode: String;
function RightPrCode: String;
function TopPrCode: String;
function BottomPrCode: String;
function IsRectangle: Boolean;
property HasArch: Boolean read GetHasArch;
function ParentSquare: TWASquare;
function Square: TWASquare;
end;
Declarația obiectului care reprezintă fereastra sau panoul (adică o poziție din ofertă)
Este util la montaj de exemplu pentru a avea o funcție comună pentru ferestre și panouri.
TWAWindowDoorPanel = class
//Lista de ochiuri este sortată in ordinea numerotării termopanelor
//si de aceea AIndex+1 poate fi folosit ca numarul termopanului
function SquaresWithGlass(AIndex: Integer): TWASquare;
function SquaresWithGlassCount: Integer;
property Width: Double;
property Height: Double;
property TotalWidth: Double;//cu tot cu profilele suplimentare
property TotalHeight: Double;
end;
Declaratia obiectului care reprezinta fereastra. Acesta mosteneste TWAWindowDoorPanel, deci se pot folosi și proprietațile acestuia.
TWAWindowDoor = class(TWAWindowDoorPanel)
//Lista de cadre, primul cu AIndex=0 fiind tocul
function Frames(AIndex: Integer): TWAFrame;
function FramesCount: Integer;
//Lista de ochiuri, primul cu AIndex=0 fiind tocul
function Squares(AIndex: Integer): TWASquare;
function SquaresCount: Integer;
//CornerCoupling = Nedeterminata = -1, Simpla = 0, TehnoHFL = 1, NoDeburring = 2
function DesiredCornerCoupling: Integer;
function CornerCoupling: Integer; //TTipImbColt = (Nedeterminata = -1, Simpla = 0, TehnoHFL = 1, NoDeburring = 2);
property Number: Integer read FPozitie; //Pozitie in comanda. Ferestrele din panou sunt 1001, 1002...
property Qty: Integer read GetQty; //numarul de bucati
end;
Declaratia obiectului care reprezinta comanda
TWAOrder = class
property InternalCode: String;
property InternalCode2: String;
property WindowsDoorsTotalQty: Integer;//chiar și pentru o comanda parțială reprezintă totalul per ofertă
function GlobalValuesValue(ACode: String): Double;
end;
Funcție pentru consum si debitare
function WA_AddCutItem(
Code: String; //poate conține și varianta separată de virgulă sau punct și virgulă (ex.: '1234;Varianta1')
Length: Double;
NumberOfPieces: Double = 1;
NumberOfCutedPieces: Integer = 0;
Angle1: Double = 90; //-1 pentru a prelua unghiul profilului apelant
Angle2: Double = 90; //-1 pentru a prelua unghiul profilului apelant
SourceTable: Integer = 0; //TTipTabelScriptFunctii = (Profile, Placare, Feronerie, Geam, Manopera, ManoperaMontaj, Accesorii, CompAccesorii, Montaj);
BaseColor: String = '';
IntApplColor: String = '';
ExtApplColor: String = '';
RabbetApplColor: String = '';
OptimizationNeeded: Boolean = False; //nu se ține cont decât la accesorii, placare și dacă este găsită culoarea (altfel este setat automat în funcție de culoare)
): Double
La WA_AddCutItem2 față de WA_AddCutItem sa schimbat parametrul OptimizationNeeded
function WA_AddCutItem2(
Code: String; //poate conține și varianta separată de virgulă sau punct și virgulă (ex.: "1234;Varianta1")
Length: Double;
NumberOfPieces: Double = 1;//valoare folosită la consum
NumberOfCutedPieces: Integer = 0;//valoare folosită la debitare
Angle1: Double = 90; //-1 pentru a prelua unghiul profilului apelant
Angle2: Double = 90; //-1 pentru a prelua unghiul profilului apelant
SourceTable: Integer = 0; //TTipTabelScriptFunctii = (Profile, Placare, Feronerie, Geam, Manopera, ManoperaMontaj)
BaseColor: String = '';
IntApplColor: String = '';
ExtApplColor: String = '';
RabbetApplColor: String = '';
OptimizationNeeded: String = '''';//Se completeaza cu 'X' sau 'B' identic cu coloana OptiPtConsum din tabelele profilelor. Nu se ține cont decât la accesorii, placare și dacă este găsită culoarea (altfel este setat automat în funcție de culoare)
): Double
Funcție pentru consum
function WA_AddItem(
Code: String; //poate conține și varianta separată de virgulă sau punct și virgulă (ex.: "1234;Varianta1")
Quantity: Double;
SourceTableType: Integer = 0; //TTipTabelScriptFunctii = (Profile, Placare, Feronerie, Geam, Manopera, ManoperaMontaj)
BaseColor: String = '';
IntApplColor: String = '';
ExtApplColor: String = '';
RabbetApplColor: String = '';
Price: Double = 0; //dacă este diferit de 0 va folosi acest pret cu valuta din baza de date
Description: String //dacă se specifică o denumire aceasta va înlocui denumirea din baza de date iar articolul se va dubla dacă are denumire diferită. Aceasta denumire va fi tradusă dacă este cazul folosind traducerea bazei de date.
): Double
Funcție pentru consum (la debitare doar la profile de fereastră)
function ProfilExp(
Cod: String;
Culoare: String = '';
Catitate: Variant = '1';
NrBuc: Variant = '1';
PozProfil: String = '';
U1: Double = -1; //-1 pentru a prelua unghiul profilului apelant
U2: Double = -1; //-1 pentru a prelua unghiul profilului apelant
SubSerie: String = '';
UBeta1: Double = 90;
UBeta2: Double = 90): Boolean
Functie pentru consum (pentru apelul funcțiilor interne)
function ExecFunc(
FunctionName: String;
Param1: Variant;
Param2: Variant = '';
Param3: Variant = '';
Param4: Variant = '';
Param5: Variant = '';
Param6: Variant = '';
Param7: Variant = '';
Param8: Variant = '';
Param9: Variant = '';
Param10: Variant = ''): Boolean
Functii pentru reținerea unor valori pe tot percursul calcularii consumului
function WA_GetPersistentVal(Name: String): Variant //întoarce Null dacă valoarea nu există
procedure WA_SetPersistentVal(Name: String; Value: Variant)
function WA_ClearPersistentVal
La începutul calcularii consumului este apelat automat WA_ClearPersistentVal.
Reținerea valorilor poate fi folosită de ex. pentru a nu calcula de mai multe ori același lucru declarând o funcție în felul următor:
function TotalCantitate: Variant;
begin
Result := WA_GetPersistentVal('TotalCantitate');
if Result = Null then begin
//Calculam si atribuim lui Result o valoare
...
Result := ...;
//Dupa care o salvam
WA_SetPersistentVal('TotalCantitate', Result);
end;
end;