Search  
Friday, February 10, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Cod, sintaxa si comenzi  Trigger FireBir...
 Trigger FireBird
 
 2/26/2010 2:33:09 PM
User is offlinemyself
60 posts


Trigger FireBird
 (N/A)
for select ltrim(rtrim(lower(lcNume))) From lista_campuri('clienti_user') into :lcNumeCamp
do
begin
Manevra = 'new.' ||ltrim(rtrim(cast(:lcnumecamp as char(50)))) || ' <> old.' ||:lcnumecamp ||'' ;
execute statement(Manevra) into :stmt ;
if (:stmt = '1') then
lcModificari = lcModificari ||lcNumeCamp ||', ';
end


Incerc sa fac un trigger sa vad exact ce campuri se modifica la update....
Cand vreau sa salvez o inregistrare primesc mesajul de eroare "Token unknown 'new'! ". Nu am nici o idee cum ar trebuii sa sune triggeru meu :)
Folosesc Firebird
 3/3/2010 11:26:37 AM
User is offlineDorin Vasilescu
1366 posts
1st




Re: Trigger FireBird
 (N/A)
Din trigger nu se pot returna date, ce vrei tu se poate in Before Update cu memorarea coloanelor modificate tot in aceeasi tabela, intr-o coloana, sa-i zicem "updates". DPDV istoric nu poti sa vezi decat daca faci insert intr-o alta tabela si le selectezi ulterior.

Comanda ta stmt este o simpla evaluare, nu se realizeaza nici o actiune. Firebird nu are corespondentul macrosubstitutie pentru alte comenzi in afara de DML care executa comenzi memorate in siruri de caractere
Dar evaluare new. , old. nu merge, trebuie sa scrii ( sau sa generezi ) secventa de
if (not old... = new... )
then modificari = ...

pentru toate coloanele






 3/3/2010 11:42:28 AM
User is offlinemyself
60 posts


Re: Trigger FireBird
 (N/A)
triggeru` meu arata cam asa : ...

as
declare variable lcId char(36);
declare variable lcExplicatii blob(16834);
declare variable lcModificari varchar(32000);
declare variable stmt varchar(1024) ;
declare variable manevra varchar(1024) ;
begin
     lcModificari = '

   Modificari efectuate la data  '|| current_timestamp  || ':    ' ;
     Manevra = '' ;
     new.dataadd = current_timestamp;




     if (new.client <> old.client) then
        begin
          Manevra = '
          - client ' || old.client || ' -> ' || new.client || '; ';
          lcModificari = lcModificari || Manevra ;
        end

     if (new.cod <> old.cod) then
        begin
          Manevra = '
          - cod ' || old.cod || ' -> ' || new.cod || '; ';
          lcModificari = lcModificari || Manevra ;
        end

     ......... restu de campuri

     lcModificari = lcModificari || iif(manevra = '','
          - Absolut nimic','')|| '
   de ' || ltrim(rtrim(new.cineadd)) || ' de pe calculatorul ' || ltrim(rtrim(new.calcadd));
     select id from logmiscari where id_inregistrare = new.id into :lcId    ;
     if (lcid is null ) then
         begin
            select upper(hex_uuid) from get_hex_uuid into :lcId ;
            lcExplicatii = '
Nu am avut istoric pana la aceasta modificare ' ||
               lcModificari   ;
            insert into logmiscari (id,tabela,id_inregistrare,history)
                values (:lcID,'CLIENTI',new.id, :lcExplicatii ) ;
         end
     else
         begin
            select history from logmiscari where id_inregistrare = new.id into :lcExplicatii    ;
            lcExplicatii = lcExplicatii ||
            ''||
            lcModificari ;
            update logmiscari set history = :lcExplicatii where id = :lcID;
         end
        
end

As fi vrut sa ma pot folosi de "macrosubstitutie" si sa scap de insiruirea de if-uri.
Nu stiu cum sa folosesc "macrosubstitutia" in acest caz....?
 3/3/2010 1:51:38 PM
User is offlinemyself
60 posts


Re: Trigger FireBird
 (N/A)
Am mai incercat si versiunea aceasta...dar... fara succes

declare variable lcCod varchar(32000) ;
declare variable lcExplicatii varchar(32000) ;
begin
     new.dataadd = current_timestamp;
     lcExplicatii = ' ' ;
     For select ' IF (new.' || trim(rdb$field_name) || ' is distinct From old.' || trim(rdb$field_name) || ') then
        lcExplicatii = lcExplicatii ||  new.' || trim(rdb$field_name) || ' ||" -> "|| old.' || trim(rdb$field_name)
        from rdb$relation_fields
        where rdb$relation_name = 'USERI'
        into :lcCod
     do
     begin
        execute statement (lcCod)  ;
     end

     insert into logmiscari (history) Values (:lcExplicatii) ;
 end


 3/4/2010 10:58:33 AM
User is offlineDorin Vasilescu
1366 posts
1st




Re: Trigger FireBird
 (N/A)
EXECUTE STATEMENT ruleaza in afara contextului triggerelor, ceva echivalent cu RUN fisier.exe din foxpro, nu exista acces la variablele locale definite in trigger.
Singura solutie e testul cu if-uri, eventual generat cu un generator de cod
 3/4/2010 4:43:20 PM
User is offlinemyself
60 posts


Re: Trigger FireBird
 (N/A)
Sunt complet dezamagit .... :(
 3/5/2010 9:45:05 AM
User is offlineDorin Vasilescu
1366 posts
1st




Re: Trigger FireBird
 (N/A) Modified By Dorin Vasilescu  on 3/5/2010 9:46:06 AM)
Asa am fost si eu :)
Avand in vedere ca scrierea acelui tip de cod este o operatie repetitiva, am creat un generator de cod pentru trigger de audit.
Se poata adapta sa genereze cod in conformitate cu cerintele tale.
gen_log_trigger.PRG.txt 
 3/5/2010 1:16:57 PM
User is offlinecostin_mentor
483 posts
www.accessoft.ro
2nd




Re: Trigger FireBird
 (N/A)
Fisierul atasat are 0 bytes.
 3/5/2010 2:41:55 PM
User is offlineDorin Vasilescu
1366 posts
1st




Re: Trigger FireBird
 (N/A)
Sa incerc sa atasez ZIP...
gen_log_trigger.zip 
  Visual FoxPro  Cod, sintaxa si comenzi  Trigger FireBir...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement