Voici 5 précisions qui vont t'aider :
1) Une requête SQL peut contenir plusieurs commandes. Dans ton cas, une pour supprimer les lignes et une pour supprimer les pieds. Dans cet ordre-là pour éviter un problème de foreign key.
Donc le code ressemble à ceci :
text to cSql noshow
delete from lignes_v where ...
delete from pieds_v where ...
endtext
De la sorte, avec un seul SqlExec tu effectues toute la mise à jour de ta DB
2) Tu te donnes beaucoup de mal pour passer en paramètre tes dates. Il suffit d'utiliser le ? devant une variable ou expression foxpro pour que les valeurs de ces paramètres soit passées simplement à SQL.
Exemple :
text to cSql noshow
delete from pieds_v where (pieds_v.date>=?m.DATE_1) and (pieds_v.date<= ?m.DATE_2) and ...
endtext
Avec cette technique, tu peux mettre toute ta requête dans le bloc text...endtext, ce qui permet de gagner en lisibilité.
3) Je te conseille vivement d'effectuer ta requête sous transaction. Parce qu'il se peut qu'un conflit multi-utilisateurs empêche de supprimer les pieds alors que tu viens de supprimer les lignes. Pour rappel, voici le code standard pour exécuter une transaction.
=sqlSetProp(m.M_SQL,'Transactions',2)
if sqlExec(m.M_SQL,m.cSQL)=1
sqlCommit(m.M_SQL)
else
sqlRollback(m.M_SQL)
endif
=sqlSetProp (m.M_SQL,'Transactions',1)
4) Les pieds de document qui correpondent à des reliquats ont le champ niveau qui est supérieur à zéro. Cela te permet d'alléger ta requête. Des requêtes imbriquées sont rarement performantes.
5) Attention de ne pas supprimer les reliquats à zéro qui sont maintenus dans la DB jusqu'au transfert en compta des paiements qui leur sont associés.
Bonjour,
Un client nous a demandé de pouvoir faire une suppression automatique de ses reliquats entre 2 dates. Càd supprimer les livraisons pour lesquelles aucune facture n'a été faite.
Je n'ai pas de problème pour supprimer les enregistrements de lignes_v mais je n'arrive pas à trouver le truc pour supprimer en même temps les pieds_v.
Auriez-vous une idée sur la piste à suivre ?
&& supprime les lignes des BLivr qui ont déjà fait l'object d'une facture
&& càd en fait, les lignes de reliquats
LOCAL old_sel, cSql
old_sel = SELECT()
msg_txt="Date des reliquats ?"
DO do_form WITH 'ASKDATES', .f., .f.
IF msg_bout=2
RETURN
endif
TEXT TO cSql
delete lignes_v
where lignes_v.ID in
( select pv.id
from lignes_v LV
inner join pieds_v pv on pv. id = lv.id
where pv.type =2 and LV.s_cle1<>'' and
pv .date>=convert(datetime,'
ENDTEXT
cSql=cSql+ DTOC(m.DATE_1)+"',103) and pv.date<=convert(datetime,'"+DTOC(m.DATE_2)+"',103) and exists (select ID from pieds_v P where P.piece_liee like '%'+ltrim(str(pv.piece,10))+'%' ) )"
stop(cSql)
&&WAIT 'Supprime toutes les lignes de reliquats. '
IF SQLEXEC(m.M_Sql, m.CSql, 'MyLignes_v')<>1
zstoperror()
SELECT(old_sel)
RETURN
endif
stop("fin de suppression")
SELECT(old_sel)
return