Transformer les instructions delphi en Sql

Résolu
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 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

19 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
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.

cantador
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
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.


cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
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..

cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 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.

a+
Notrica
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
21 sept. 2009 à 14:12
pour moi ta structure ne tient pas la route.
et c'est bien ton modèle qui est faux..

En fait il faut que tu établisses un schèma avec deux tables :

Une qui stocke des éléments de portée générale et l'autre les valeurs numériques ou monétaires (peu importe..)

Quelle est la clé entre ces deux tables ?
réponse le mois de gestion en cours.

autrement dit tu as une relation 1-N entre la première table et la seconde..

tant est si bien que dans cette dernière, tu auras un stockage du style :


cleAI codemois  valeur1   valeur2   valeur3
1      1        512,28    45,32     3154,89
2      2        247,98    28,74     7489,45


etc. etc.
Il n'y a même pas à stocker le mois en dur.

c'est quand même plus sympa à gérer..

A tes crayons !

Quant ton modèle tiendra la route et répondra à tes besoins alors le reste se fera tout seul..

cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
21 sept. 2009 à 17:12
Merci Cantador,
Voici ma logique, j'ai un fichier TFPLANGEN qui gère les articles durant une année:
GLCpteID  LIBELLE  Zmtc01   Zmtc02 ---- Zmtc12

  123     Mse     1500,00     0,00        0,00
  260     Mouton  2600,00     0;00        0,00
:

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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
21 sept. 2009 à 17:33
oui, mais en fait tout dépend de ce que tu fais après ce stockage..
et ça pour l'instant personne ne le sait...

Au début on aurait pu penser à une simple gestion mensuelle, mais maintenant c'est une gestion par article et par mois..

c'est très difficile de répondre à ce genre d'exercice à travers un forum car il faudrait être deux devant un tableau noir..

pour ta requête il faut mettre le nom du champ
sinon le SQL ne comprendra pas :

SET Zmtc01 = valeur
ou passe un paramétrage
SET Zmtc01 =:ParamValeur

ou alors fais un locate sur la table TFPLANGEN
et passe des instruction Edit et Post.

je vais quand même regarder si on peut paramétrer les noms des champs en traitant le tout comme une chaîne...


cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 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
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
22 sept. 2009 à 10:35
Merci Cantador, je me mets au travail et vous donnerez la suite de l'évolution.
Encore une fois merci.
a+
Notrica
0
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 3
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


Oniria
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 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
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
26 sept. 2009 à 23:16
Mais une chose, j'ai éclaté la table PlaGen en trois tables ( PlaGen, PlaTrans, PlaSolde).

je vois que le métier commence à rentrer...

pour l'update, on peut faire la mise à jour de plusieurs champs en même temps avec plusieurs conditions..

cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 sept. 2009 à 23:53
je te renvoie à ce tuto car il y a beaucoup de façons de traiter les UPDATE :

UPDATE


attention néanmoins certaine formes ou fonctions sont spécifiques à chaque base utilisée..


cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
28 sept. 2009 à 08:54
C'est génial Cantador, Merci bcp pour tout.
Bonne Contnuité. Je vous retrouverai plus tard.
a+
Notrica
0
merci
0
Rejoignez-nous