notrica
Messages postés89Date d'inscriptionlundi 12 décembre 2005StatutMembreDernière intervention19 octobre 2013
-
18 sept. 2009 à 15:41
ali08833 -
3 oct. 2012 à 14:50
Salut
J'ai une très grd préocupation. En faite j'avais ecris les instructions d'accès aux données en delphi. j'ai changé de cap, je voudrais transformer ses instructions delphi en sql. j'ai rencontré un problème qui me dépasse étant donnée que se la 1ere fois que j'ecris les instructions sql. les problème consiste en ceci voici le code delphi tel qu'il se présente :
with QPlaGen do begin
Active := false;
Sql.Clear;
Sql.Add('Select * from TFPlanGen Order By GLCpteID');
Active := true;
ZonField := 'ZmtC'+xmois;
ZonFieldUs := 'ZmtCUs'+xmois;
ZonTot := 'ZTotC';
ZonTotUs := 'ZTotCUs';
Edit;
FieldByName(ZonField).Value := ztmtant;
FieldByName(ZonFieldus).Value := ztmtantus;
FieldByName(ZonTot).Value := ztotmt;
FieldByName(ZonTotUs).Value := ztotmtus;
QPlaGenSolde.Value := QPlaGenZtotD.Value-QPlaGenZTotC.Value;
QPlaGenSoldeUs.AsFloat := QPlaGenZtotDus.AsFloat-QPlaGenZtotCus.AsFloat;
Ceci fonctionne normalement en delphi, je voudrais changer la partie affection des valeurs en sql dont voici le code :
Close;
SQL.Clear;
SQL.Add('UPDATE TFPlanGen SET FieldByName(ZonField).Value='+FloatToStr(ztmtant)
+',FieldByName(ZonFieldus).Value='+FloatToStr(ztmtantus)
+',FieldByName(ZonTot).Value='+FloatToStr(ztotmt)
+',FieldByName(ZonTotUs).Value='+FloatToStr(ztotmtus)
+',Solde='+FloatToStr(QPlaGenZtotD.Value-QPlaGenZTotC.Value)
+',SoldeUs ='+FloatToStr(QPlaGenZtotDus.Value-QPlaGenZtotCus.Value)+ ' ');
try
ExecSQL;
except
on e:exception do
showmessage(' *** ERROR ** '+ e.Message);
end;
Ceci ne marche pas pcq 'ZonField' de FieldByName contient le nom 'ZmtC01' nom de Colonne de la table 'QPlaGen' logé dans Sql-serveur 2005.
Y-a-t'il un moyen de contourner celà ? Dans un 1er temps j'ai un message d'erreur "Syntaxe incorrecte ver ')".
Que dois-je faire ?.
D'avance Merci.
a+
Notrica
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202114 22 sept. 2009 à 09:46
inutile de perdre du temps sur le sujet..
en fait, il y a confusion entre la manière avec la quelle on stocke les données dans une table et leur représentation sous forme d'états ou d'histogrammes...
Cette présentation en colonne peut et doit se traiter à part (tableau croisé etc..) mais ne doit pas servir de modèle pour le stockage..
Autrement dit, il est nécessaire d'introduire
dans la table trois clés (le code article et le mois et la valeur)
et du coup plus de soucis de paramétrage:
il suffit d'introduire une petite procedure
avec ces trois paramètres :
procedure Stockage(Article : string;MoisEnCours :integer;Valeur : Currency);
begin
With MonQuery.SQL do
begin
Clear;
Add('Update Matable ');
Add('SET ChpValeur =:MaValeur ');
Add('WHERE (Mois =:IdMois) and (CodeArticle =:CodeArt) ');
MonQuery.ParamByname('MaValeur').value := Valeur;
MonQuery.ParamByname('IdMois').value := MoisEnCours;
MonQuery.ParamByname('CodeArt').value := Article;
MonQuery.ExecSQL;
end;
end;
Attention, il s'agit d'une Maj ce qui suppose que les données sont introduites la première fois avec une requête INSERT jusqu'à 12 mois..
et ensuite elles sont écrasées avec les suivantes
Si tu souhaites conserver un historique, il faut introduire la notion d'exercice comptable ou année comptable.
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202114 21 sept. 2009 à 10:21
Bon, déjà evites de multiplier les posts sur le même sujet..
Tu mélange du Pascal et du SQL...
FieldByName(ZonField).Value n'est pas une instruction SQL.
c'est donc normal que cela ne marche pas..
et autre chose commence par expliquer ce que tu veux faire et non fournir directement une méthode..
Comment est introduit xmois ?
Pourquoi ce 01, 02, 03 dans les nom des colonnes ?
etc. etc etc.
Car lorsque tu auras bien détaillé alors peut-être certains trouveront une meilleure solution.
notrica
Messages postés89Date d'inscriptionlundi 12 décembre 2005StatutMembreDernière intervention19 octobre 2013 21 sept. 2009 à 10:37
Salut;
Il n'y a personne qui connait SQL sur le Forum qui peut m'aider ?.
Ma table contient des colonnes " Zmtc01; Zmtc02; Zmtc03; ..." le numérique constitue le mois alors à chaque mois je dois transférer le montant dans la zone du mois correspondant suivant le mois de gestion en cours.
Si cela est impossible en SQL, vous me dite quand même un mot.
a+
Notrica
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202114 21 sept. 2009 à 11:23
le numérique constitue le mois alors à chaque mois je dois transférer le montant dans la zone du mois correspondant suivant le mois de gestion en cours.
C'est malin !
C'est au tout début qu'il aurait fallut dire ça..
Maintenant, il faut tout repenser avant de dire que c'est impossible !
cantador
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202114 21 sept. 2009 à 11:42
il manque encore des informations...
la structure de la table et aussi
tu lances un 'UPDATE TFPlanGen SET...'
très bien mais un UPDATE non paramétré, ça modifie toute la table...
et je suppose que ce n'est pas ce que tu souhaites faire...
Que fait-tu de l'historique ?
Se poser les bonnes questions dirait un certain Loda qui nous manque..
On a le sentiment que tu as mis la charrue avant les boeufs dans ce projet..
Même une mini base de données réclame un minimum d'analyse..
Si ce n'est pas fait dès le départ, alors tu retrouves tous les soucis au niveau de la programmation et après tu passes ton temps à recoller tous les morceaux..
L'audit fait partie de la construction du projet..
notrica
Messages postés89Date d'inscriptionlundi 12 décembre 2005StatutMembreDernière intervention19 octobre 2013 21 sept. 2009 à 13:01
Merci Cantador, Vous avez tout à fait raison pcq je n'ai pas donné tous les éléments de la structure du ficher "TFPlanGen". Voici la structure :
'GlCompteID char(10)(clé de l'enregistrement); Libellé char(30), Zmtc01 ; Zmtc02.... Zmtc12 et ZTotC, Solde', sont 'money' ou numérique.'
Alors le xmois contient le mois de gestion en cours extrait de la date de l'opération qui me permettra, de concaténer avec Zmtc,et retrouver la ligne puis la colonne à mettre à jour dans la table.
je pense que c'est clair.
Merci d'avance cantador.
Lorsque le mois de gestion est janvier par ex et l'article qui a subi le mouvement c'est '123' je recherche le 123 puis je met la valeur dans la colonne du mois de janvier ici représenté par 'Zmtc01' et si le mois de gestion est février je met dans la colonne Zmtc02 etc. l'article peut ou pas subir un mouvement durant le mois.
Donc 'Zmtc'+01(janvier) = Zmtc01
la clé se retrouve une seule fois dans le fichier et avoir une valeur cumulée pour chaque article.
Je ne sais pas si mon idée est bonne.
a+
Notrica
notrica
Messages postés89Date d'inscriptionlundi 12 décembre 2005StatutMembreDernière intervention19 octobre 2013 21 sept. 2009 à 20:32
Merci Cantador,
Si dans pascal on sait faire cela, est-ce pour dire que Sql ne prévoit pas ce genre de commande pour qu'a partir d'une variable on y loge un nom de colonne d'une table dans l'exemple de ZonField := 'ZmtC'+xmois.
Donc en définitif il n-y a pas une possibilité pour celà.
SVP, pouvez-vs me proposer qlq chose en sql pour contourner l'obstacle. je n'y connait pas bcp sur sql, je suis un debutant dans ce domaine pcq j'étais buté au problème d'accès multiple. au besoin un petit extrait de code si possible de ce que je dois faire.
Merci d'avance Cantador.
a+
Notrica
Oniria
Messages postés292Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention18 décembre 20143 24 sept. 2009 à 09:51
Bonjour,
Notrica, regarde bien les commandes SQL, elles te permettent de faire des calculs directement. Tu peut ainsi demander de récupérer la somme total sur l'année en cours d'un article, etc... (la commande en question est SELECT ...).
Bon codage
notrica
Messages postés89Date d'inscriptionlundi 12 décembre 2005StatutMembreDernière intervention19 octobre 2013 26 sept. 2009 à 07:36
Merci Oniria, est-il possible de m'illustrer par un exemple qui peut m'aider par la commande SELECT faire la somme puis caser cela dans une variable ou une colonne d'une table.
a+
Notrica
notrica
Messages postés89Date d'inscriptionlundi 12 décembre 2005StatutMembreDernière intervention19 octobre 2013 26 sept. 2009 à 07:42
Salut Cantador,
Votre exemple m'a bcp servi dans mon travail, je vous en remerci. Mais une chose, j'ai éclaté la table PlaGen en trois tables ( PlaGen, PlaTrans, PlaSolde).
Pour la mise à jour UPDATE faut-il mettre le UPDATE à la suite càd un après l'autre ou bien il y a une façon de le faire dans un seul UPDATE ? Si oui, Comment le faire?
a+
notrica
notrica
Messages postés89Date d'inscriptionlundi 12 décembre 2005StatutMembreDernière intervention19 octobre 2013 27 sept. 2009 à 23:14
Oui, je m'imprègne petit à petit du métier.., Puis-je vous demander si possible de vous servir de l'exemple ci-dessus me montrer comment m'y prendre en se servant de ce trois fichiers avec les noms des colonnes de votre choix ?
Merci d'avance Cantador pour votre aide.
a+
Notrica