Generator van SQL-opdrachten

0000001970     -      04-10-2015

In de modules moeten vaak 'insert'- of 'update'-opdrachten worden geschreven die betrekking hebben op alle velden van een tabel. Dat kan een eentonig werk zijn. En als u een opdracht in een FoxPro- of C#-module definitief hebt vastgelegd, stelt zich vervolgens het probleem dat die tabel in de toekomst mogelijk met nieuwe velden moet worden uitgebreid. Waarvoor dan een correctie en een hercompilatie van de module vereist kan zijn.

Vanaf versie 7.3.143 beschikt u over 3 nieuwe scalaire functies:

  • CREATE_INSERT_WITH_PARAMS
  • CREATE_UPDATE_WITH_PARAMS
  • CREATE_INSERT_UPDATE_WITH_PARAMS

 

Deze 3 functies vereisen slechts één parameter: de naam van de tabel waarvoor de opdracht is gevraagd.

Voorbeelden

select dbo.CREATE_INSERT_WITH_PARAMS ( 'LIGNES_V' ) as reqSql

vermeldt

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

vermeldt

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)

In deze laatste opdracht merkt u dat de primaire sleutel automatisch werd gedetecteerd en in aanmerking is genomen.
Merk ook op dat de velden van de primaire sleutel niet zijn overgenomen in de velden van de UPDATE. Dat is inderdaad een klassieke fout. U moet weten dat dat de eventuele opeenvolging van de foreign key(s) zou activeren, wat uitermate nadelig kan zijn voor de prestaties (zelfs als u de waarde van de velden van de foreign key niet verandert).

 

select dbo.CREATE_INSERT_UPDATE_WITH_PARAMS ( 'LIGNES_V' ) as reqSql

vermeldt

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)

 

Dit kan u helpen om tijd te winnen bij het ontwikkelen!


Trefwoorden: generator, opdracht