Editare Script funcții

<< Click to Display Table of Contents >>

Navigation:  WinArhi > Fereastra principala > Oferte si Comenzi deschise > Meniu > Optiuni >

Editare Script funcții

Editare Script funcții

BrowseBlueLeft BrowseBlueRight

 

 

EditareScriptFunctii

 

 

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, ...

  PrWithKeyCylinder: Boolean;

  PrWithHandle: Boolean;

  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

  PositionsLength: Integer;

  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)

 

  WAOrder: TWAOrder;

  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;