Transformer les instructions delphi en Sql [Résolu]

Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Dernière intervention
19 octobre 2013
- 18 sept. 2009 à 15:41 - Dernière réponse :  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
Afficher la suite 

Votre réponse

19 réponses

Meilleure réponse
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
22 sept. 2009 à 09:46
3
Merci
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

Merci cs_cantador 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
21 sept. 2009 à 10:21
0
Merci
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
Commenter la réponse de cs_cantador
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Dernière intervention
19 octobre 2013
21 sept. 2009 à 10:37
0
Merci
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
Commenter la réponse de notrica
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
21 sept. 2009 à 11:23
0
Merci
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
Commenter la réponse de cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
21 sept. 2009 à 11:42
0
Merci
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
Commenter la réponse de cs_cantador
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Dernière intervention
19 octobre 2013
21 sept. 2009 à 13:01
0
Merci
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
Commenter la réponse de notrica
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
21 sept. 2009 à 14:12
0
Merci
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
Commenter la réponse de cs_cantador
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Dernière intervention
19 octobre 2013
21 sept. 2009 à 17:12
0
Merci
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
Commenter la réponse de notrica
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
21 sept. 2009 à 17:33
0
Merci
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
Commenter la réponse de cs_cantador
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Dernière intervention
19 octobre 2013
21 sept. 2009 à 20:32
0
Merci
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
Commenter la réponse de notrica
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Dernière intervention
19 octobre 2013
22 sept. 2009 à 10:35
0
Merci
Merci Cantador, je me mets au travail et vous donnerez la suite de l'évolution.
Encore une fois merci.
a+
Notrica
Commenter la réponse de notrica
Messages postés
297
Date d'inscription
dimanche 14 mars 2004
Dernière intervention
18 décembre 2014
24 sept. 2009 à 09:51
0
Merci
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
Commenter la réponse de Oniria
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Dernière intervention
19 octobre 2013
26 sept. 2009 à 07:36
0
Merci
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
Commenter la réponse de notrica
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Dernière intervention
19 octobre 2013
26 sept. 2009 à 07:42
0
Merci
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
Commenter la réponse de notrica
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
26 sept. 2009 à 23:16
0
Merci
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
Commenter la réponse de cs_cantador
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Dernière intervention
19 octobre 2013
27 sept. 2009 à 23:14
0
Merci
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
Commenter la réponse de notrica
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
27 sept. 2009 à 23:53
0
Merci
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
Commenter la réponse de cs_cantador
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Dernière intervention
19 octobre 2013
28 sept. 2009 à 08:54
0
Merci
C'est génial Cantador, Merci bcp pour tout.
Bonne Contnuité. Je vous retrouverai plus tard.
a+
Notrica
Commenter la réponse de notrica
Commenter la réponse de ali08833

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.