Arjuna Aircraft Ident.: F-MBSD | Oracle, c'est de la merde et c'est pas nouveau.
Le "to_number" se localise comme un con à partir de la locale du client, et du coup j'ai un trigger mal codé qui plante.
J'ai pas envie de le foutre en l'air, donc je veux juste faire la modif bidon qui va me permettre de le squizer.
Dans ma requête, dans mon cas précis, j'ai "SIGDEP" qui est vide ( :new.sigdep = ' ' ).
Hors, applicativement, c'est impossible, donc je suis certain que seul "moi" pourrai faire cette requête (un peu compliqué à expliquer, mais c'est ce qu'il y a de plus propre à faire, mise à part corriger le trigger, mais j'ai pas envie de me plonger dedans)
Du coup, je voudrais simplement faire un test sur le trigger : si sigdep != ' ', alors je fais tout le bordel, sinon je zappe.
Sauf que la syntaxe PL/SQL est un gros mystère pour moi, et je m'en sors pas. Je suis sur le serveur de production, et du coup à chaque test, je vous tous les utilisateurs dans les choux. Ca me lourde.
Est-ce que qq1 peut me dire quoi rajouter ?
Code :
- CREATE OR REPLACE TRIGGER "SOC1"."MAJ_PRO" AFTER INSERT OR UPDATE OF "CODPRO", "CODSOC", "CODZN2", "SIGFOU", "VOLUME" ON "SOC1"."PRO" FOR EACH ROW WHEN (nvl(old.codzn2,0)<>new.codzn2 or old.volume<>new.volume and new.codsoc<>3)
- declare
- cursor frn is
- select coddev,decode(codzn1,' ','0',codzn1) codzn1,
- replace(decode(codzn2,' ','0',codzn2),',','.') codzn2
- from tie
- where sigtie=:new.sigfou and typtie='FOU' and codsoc=:new.codsoc;
- codev varchar2(6);
- dadev varchar2(30);
- txdev number(18,6);
- cdzn varchar2(12);
- pxach number;
- frapp number;
- pxrev number;
- coefmg number:=2.2;
- pxvenc number;
- pxven number;
- mrgval number;
- mrgpct number;
- dev_abs varchar2(2):='NK';
- begin
- --- MON TEST ICI
- for f in frn loop
- begin
- select cours into txdev from dem
- where codsoc=:new.codsoc and coddev=f.coddev and natdev='PRE' and
- (datdeb,datfin) = (select max(datdeb), datfin from dem
- where codsoc=:new.codsoc and coddev=f.coddev and
- natdev='PRE' and datdeb<=to_char(sysdate,'yyyymmdd') and
- nvl(datfin,'29991231')<=to_char(sysdate,'yyyymmdd')
- group by datfin
- having max(datdeb)<=to_char(sysdate,'yyyymmdd'));
- exception
- when no_data_found then txdev:=1;
- end;
- if :new.codzn2=' ' /* px achat obligatoire */
- then cdzn:='1';
- else cdzn:=:new.codzn2;
- end if;
- pxach:=to_number(replace(cdzn,',','.'))*to_number(txdev);
- if (f.codzn1=0 and f.codzn2=0)
- then frapp:=0;
- else if f.codzn2=0 /* val au m3 par defaut sinon %VM */
- then frapp:=to_number(f.codzn1)*pxach/100;
- else frapp:=to_number(f.codzn2)*:new.volume;
- end if;
- end if;
- pxrev:=pxach+frapp;
- pxvenc:=pxrev*coefmg; /* que pour insertion */
- mrgval:=pxvenc-pxrev;
- if pxvenc<>0
- then mrgpct:=mrgval/pxvenc; /*/100;*/
- else mrgpct:=mrgval;
- end if;
- begin
- select px_vent into pxven
- from wt_prdwr_art
- where co_art=:new.codpro and co_soc=:new.codsoc and co_dev=f.coddev;
- /* mrgval:=pxvenc-pxrev;
- if pxvenc<>0
- then mrgpct:=mrgval/pxvenc;
- else mrgpct:=mrgval;
- end if;
- if pxrev<>0
- then coefmg:=pxvenc/pxrev;
- else coefmg:=pxvenc;
- end if;
- coef_mrg=coefmg, */
- update wt_prdwr_art set px_acht=pxach, fr_apprt=frapp, px_revt=pxrev,
- mrg_valt=mrgval, mrg_prctgt=mrgpct,
- da_modif=sysdate, tx_dev=txdev, px_vent=pxvenc
- where co_art=:new.codpro and co_soc=:new.codsoc and co_dev=f.coddev;
- exception
- when no_data_found then
- insert into wt_prdwr_art
- values (:new.codsoc, :new.codpro, f.coddev, txdev, pxach, frapp, pxrev, coefmg,
- pxvenc, mrgval, mrgpct, sysdate,sysdate);
- end;
- end loop;
- exception
- when no_data_found then null;
- end;
|
Merci |