Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

Générateur de requêtes SQL

0000001970     -      04/10/2015

Dans les modules, il est fréquent de devoir écrire des requêtes insert ou update qui concernent l’ensemble des champs d’une table. Cela peut être fastidieux à écrire. Se pose ensuite le problème, si vous avez hardcodé une requête dans un module  FoxPro ou C#, que cette table peut être dotée de nouveaux champs dans le futur. Cela peut, dès lors, exiger une correction et une recompilation du module.

A partir de la version 7.3.143, vous disposez de 3 nouvelles fonctions scalaires :

  • CREATE_INSERT_WITH_PARAMS
  • CREATE_UPDATE_WITH_PARAMS
  • CREATE_INSERT_UPDATE_WITH_PARAMS

 

Ces 3 fonctions attendent un seul paramètre qui est le nom de la table pour laquelle on souhaite obtenir la requête.

Exemples :

select dbo.CREATE_INSERT_WITH_PARAMS ( 'LIGNES_V' ) as reqSql

renvoie

insert into LIGNES_V (ID, JOURNAL, PIECE, ID_ARTICLE, DESIGNATIO, S_GAMENUM1, S_GAMENUM2, Q, PU, REMISE, TOTAL, TAUX_TVA, POIDSNET, POIDSBRUT, COLISAGE, Q_CONDIT, NUM_SERIE, SERIE, REC_SERIE, Q_TEMP, LIVRE, DE_NO, DL_ID, MAESLIVR, PROMOSOLDE, SS_TOTAL, LIAISON, DL_ID_LIEN, LIEN_Q, TOT_NET_HT, TOT_NET_TI, Q_BO, S_UNITE, ANALYT1, Q_ORI, HORS_ESC, NOT_PR, GENERIQ, REAPPROGEN, RECNO, ID_DESTIN, ID_LOT, SUPPO, QUI, ID_PRESTAT, ID_PROJET)
values
(@ID, @JOURNAL, @PIECE, @ID_ARTICLE, @DESIGNATIO, @S_GAMENUM1 ,@S_GAMENUM2, @Q, @PU, @REMISE, @TOTAL, @TAUX_TVA, @POIDSNET, @POIDSBRUT, @COLISAGE, @Q_CONDIT, @NUM_SERIE, @SERIE, @REC_SERIE, @Q_TEMP, @LIVRE ,@DE_NO, @DL_ID, @MAESLIVR, @PROMOSOLDE, @SS_TOTAL, @LIAISON, @DL_ID_LIEN, @LIEN_Q, @TOT_NET_HT, @TOT_NET_TI, @Q_BO, @S_UNITE, @ANALYT1, @Q_ORI, @HORS_ESC, @NOT_PR, @GENERIQ, @REAPPROGEN, @RECNO, @ID_DESTIN, @ID_LOT, @SUPPO, @QUI ,@ID_PRESTAT, @ID_PROJET)

 

select dbo.CREATE_UPDATE_WITH_PARAMS ( 'LIGNES_V' ) as reqSql

renvoie

update LIGNES_V set ID_ARTICLE=@ID_ARTICLE, DESIGNATIO=@DESIGNATIO, S_GAMENUM1=@S_GAMENUM1, S_GAMENUM2=@S_GAMENUM2, Q=@Q, PU=@PU, REMISE=@REMISE, TOTAL=@TOTAL, TAUX_TVA=@TAUX_TVA, POIDSNET=@POIDSNET, POIDSBRUT=@POIDSBRUT, COLISAGE=@COLISAGE, Q_CONDIT=@Q_CONDIT, NUM_SERIE=@NUM_SERIE, SERIE=@SERIE, REC_SERIE=@REC_SERIE, Q_TEMP=@Q_TEMP, LIVRE=@LIVRE, DE_NO=@DE_NO, MAESLIVR=@MAESLIVR, PROMOSOLDE=@PROMOSOLDE, SS_TOTAL=@SS_TOTAL, LIAISON=@LIAISON, DL_ID_LIEN=@DL_ID_LIEN, LIEN_Q=@LIEN_Q, TOT_NET_HT=@TOT_NET_HT, TOT_NET_TI=@TOT_NET_TI, Q_BO=@Q_BO, S_UNITE=@S_UNITE, ANALYT1=@ANALYT1, Q_ORI=@Q_ORI, HORS_ESC=@HORS_ESC, NOT_PR=@NOT_PR, GENERIQ=@GENERIQ, REAPPROGEN=@REAPPROGEN, RECNO=@RECNO, ID_DESTIN=@ID_DESTIN, ID_LOT=@ID_LOT, SUPPO=@SUPPO, QUI=@QUI, ID_PRESTAT=@ID_PRESTAT, ID_PROJET=@ID_PROJET where (ID=@ID) and (JOURNAL=@JOURNAL) and (PIECE=@PIECE) and (DL_ID=@DL_ID)

Sur cette dernière requête, notez que la clé primaire a été automatiquement détectée et prise en compte.
Notez encore que les champs de la clé primaire ne sont pas repris dans les champs du UPDATE. Il s’agit en effet d’une erreur classique. Il faut savoir que cela mettrait en route la cascade éventuelle sur la/les foreign key, ce qui peut nuire très gravement aux performances. (même si on ne change pas la valeur des champs de la foreign key)

 

select dbo.CREATE_INSERT_UPDATE_WITH_PARAMS ( 'LIGNES_V' ) as reqSql

renvoie

if exists(select * from LIGNES_V where (ID=@ID) and (JOURNAL=@JOURNAL) and (PIECE=@PIECE) and (DL_ID=@DL_ID))
    update LIGNES_V set ID_ARTICLE=@ID_ARTICLE, DESIGNATIO=@DESIGNATIO, S_GAMENUM1=@S_GAMENUM1, S_GAMENUM2=@S_GAMENUM2, Q=@Q, PU=@PU, REMISE=@REMISE, TOTAL=@TOTAL, TAUX_TVA=@TAUX_TVA, POIDSNET=@POIDSNET, POIDSBRUT=@POIDSBRUT, COLISAGE=@COLISAGE, Q_CONDIT=@Q_CONDIT, NUM_SERIE=@NUM_SERIE, SERIE=@SERIE, REC_SERIE=@REC_SERIE, Q_TEMP=@Q_TEMP, LIVRE=@LIVRE, DE_NO=@DE_NO, MAESLIVR=@MAESLIVR, PROMOSOLDE=@PROMOSOLDE, SS_TOTAL=@SS_TOTAL, LIAISON=@LIAISON, DL_ID_LIEN=@DL_ID_LIEN, LIEN_Q=@LIEN_Q, TOT_NET_HT=@TOT_NET_HT, TOT_NET_TI=@TOT_NET_TI, Q_BO=@Q_BO, S_UNITE=@S_UNITE, ANALYT1=@ANALYT1, Q_ORI=@Q_ORI, HORS_ESC=@HORS_ESC, NOT_PR=@NOT_PR, GENERIQ=@GENERIQ, REAPPROGEN=@REAPPROGEN, RECNO=@RECNO, ID_DESTIN=@ID_DESTIN, ID_LOT=@ID_LOT, SUPPO=@SUPPO, QUI=@QUI, ID_PRESTAT=@ID_PRESTAT, ID_PROJET=@ID_PROJET where (ID=@ID) and (JOURNAL=@JOURNAL) and (PIECE=@PIECE) and (DL_ID=@DL_ID)
else
    insert into LIGNES_V (ID, JOURNAL, PIECE, ID_ARTICLE, DESIGNATIO, S_GAMENUM1, S_GAMENUM2, Q, PU, REMISE, TOTAL, TAUX_TVA, POIDSNET, POIDSBRUT, COLISAGE, Q_CONDIT, NUM_SERIE, SERIE, REC_SERIE, Q_TEMP, LIVRE, DE_NO, DL_ID, MAESLIVR, PROMOSOLDE, SS_TOTAL, LIAISON, DL_ID_LIEN, LIEN_Q, TOT_NET_HT, TOT_NET_TI, Q_BO, S_UNITE, ANALYT1, Q_ORI, HORS_ESC, NOT_PR, GENERIQ, REAPPROGEN, RECNO, ID_DESTIN, ID_LOT, SUPPO, QUI, ID_PRESTAT, ID_PROJET)
values
(@ID, @JOURNAL, @PIECE, @ID_ARTICLE, @DESIGNATIO, @S_GAMENUM1, @S_GAMENUM2, @Q, @PU, @REMISE, @TOTAL, @TAUX_TVA, @POIDSNET, @POIDSBRUT, @COLISAGE, @Q_CONDIT, @NUM_SERIE, @SERIE, @REC_SERIE, @Q_TEMP, @LIVRE, @DE_NO, @DL_ID, @MAESLIVR, @PROMOSOLDE, @SS_TOTAL, @LIAISON, @DL_ID_LIEN, @LIEN_Q, @TOT_NET_HT, @TOT_NET_TI, @Q_BO, @S_UNITE, @ANALYT1, @Q_ORI, @HORS_ESC, @NOT_PR, @GENERIQ, @REAPPROGEN, @RECNO, @ID_DESTIN, @ID_LOT, @SUPPO, @QUI, @ID_PRESTAT, @ID_PROJET)

 

Ceci est de nature à faire gagner du temps dans vos développements !


Mots clés : generateur, requete