Nemasix Posté(e) le 25 février 2014 Partager Posté(e) le 25 février 2014 Bonjour à tous,j'ai un petit truc à faire en MS SQL pour ma boite et je ne vois pas par quel bout prendre le truc.En gros, pour résumé, je dois faire un INSERT à partir d'un SELECT tout ce qu'il y a de plus normal.Le seul soucis, c'est qu'on voudrait mettre un ordre de ligne car ma table se fait en plusieurs fois. INSERT INTO tata (IdFacture, Numero, Montant, Ordre) SELECT IdFacture, Numero, Montant, Ordre -- Ici nous voulons notre compteur FROM toto GO INSERT INTO tata (IdFacture, Numero, Montant, Ordre) SELECT IdFacture, Numero, Montant, Ordre -- Ici nous voulons notre compteur FROM titi GO En gros, dans Ordre, je cherche à faire un compteur qui me renvoie, dans l'ordre, la première ligne insérée, puis la deuxième... ect ect. Mais lorsque je passe à la table titi, il faudrait reprendre le compteur là où il en était, et continuer le comptage. Je ne vois pas trop comment faire, si vous avez des pistes ou autres. Merci d'avance. Goghvan Lien vers le commentaire Partager sur d’autres sites More sharing options...
snoopy1492 Posté(e) le 25 février 2014 Partager Posté(e) le 25 février 2014 Humm, c'est pas la fonction première de auto_increment? Ou alors j'ai pas tout à fait compris le besoin... Ce qui est fort possible http://dev.mysql.com/doc/refman/5.0/fr/example-auto-increment.html Bref si je résume, dans ta table tu as une colonne en auto_increment dont le nombre va s'incrémenter à chaque ajout. Quelque soit l'endroit d’où vienne l'ajout... Lien vers le commentaire Partager sur d’autres sites More sharing options...
RinDman Posté(e) le 25 février 2014 Partager Posté(e) le 25 février 2014 Tu peux faire une requête qui récupère la valeur "max", ainsi il peut reprendre là où il s'est arrêté, sinon tu vas devoir faire N fois la requête jusqu'à qu'il tombe sur la bonne valeur xD Ou sinon ORDRE, tu le serialise, comme a proposé snoopy x) ( je sais pas si ça se dit comme ça ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nemasix Posté(e) le 25 février 2014 Auteur Partager Posté(e) le 25 février 2014 Humm, c'est pas la fonction première de auto_increment? Ou alors j'ai pas tout à fait compris le besoin... Ce qui est fort possible http://dev.mysql.com/doc/refman/5.0/fr/example-auto-increment.html Bref si je résume, dans ta table tu as une colonne en auto_increment dont le nombre va s'incrémenter à chaque ajout. Quelque soit l'endroit d’où vienne l'ajout... C'est vrai que j'y ai pas pensé. Par contre j'ai oublié de préciser que la table cible est une table temporaire. Y a-t-il un "bloquage" par rapport a ça ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
RinDman Posté(e) le 25 février 2014 Partager Posté(e) le 25 février 2014 Temporaire ... Bah ça peut recommencer à 0, c'est gênant ? C'est une vue à la base ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nemasix Posté(e) le 25 février 2014 Auteur Partager Posté(e) le 25 février 2014 Temporaire ... Bah ça va recommencer à 0, c'est pas gênant ? En fait ma table temporaire est temporaire le temps de la procédure. Donc ça repartira a zéro après le traitement Lien vers le commentaire Partager sur d’autres sites More sharing options...
snoopy1492 Posté(e) le 25 février 2014 Partager Posté(e) le 25 février 2014 Voila mon idée qui fonctionne si tu peux garder la table tata mais vide:Créer la table tata "temporaire" avec auto incrementInsérer tout ce que tu veux.Une fois que tu n'as plus besoin des données de tata :Stocker la valeur de l'auto_increment avec SELECT LAST_INSERT_ID() FROM tata Supprimer toutes les données de la table : DELETE FROM tata Et faire un ALTER TABLE tata AUTO_INCREMENT = valeur_stockée+1; Comme ca la prochaine fois que tu réajoute des données dans tata, l'increment continuera :) Sinon pour une solution sans garder la table, faudrait en savoir un peu plus et surtout qu'advient-il des données une fois passée par cette table temporaire. En clair, si elles vont dans une autre table, est-ce que la valeur de l'increment est conservée? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nemasix Posté(e) le 26 février 2014 Auteur Partager Posté(e) le 26 février 2014 En fait les enregistrements se font dans une procédure et j'ai besoin d'ordonner mes enregistrements seulement sur la procédure. Donc je vais me trimballer la table temporaire (ce que je fais déjà) mais juste avec un auto_increment C'est parfait, je viens d'arriver au boulot. Merci encore Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nemasix Posté(e) le 26 février 2014 Auteur Partager Posté(e) le 26 février 2014 Bon bah en fait en parlant avec la chef de projet, je me rend compte que j'avais pas vraiment ciblé le problème En gros pour faire simple, je dois faire des écritures de facture. Dans mes INSERT INTO, je peux avoir plusieurs fois le même IdFacture avec des HT, TVA et TTC. Le truc c'est que je dois classé par ordre les HT puis les TVA puis les TTC sachant qu'il peut y avoir plusieurs HT et/ou TVA. L'ancien code me donne ça, où Ordre me donnais l'ordre exact des HT/TVA/TTC (à l'époque le maxi était 2 HT, 1 TVA et 1 TTC : CREATE TABLE #TmpLigneFactureAEcrire (IdFacture bigint NULL,CompteProduit varchar(10) NULL,Analytique varchar(15) NULL,Montant money NULL, Ordre tinyint NULL, -- HT1 : 1, HT2 : 2, TVA : 3, TTC : 4IdCPEmetteur int NULL,IdTauxTva int NULL)Les insert se font comme ça (version simplifié) :INSERT INTO #TmpLigneFactureAEcrire (IdFacture,CompteProduit,IdCPEmetteur,Analytique,IdTauxTva,Montant,Ordre)SELECT DISTINCTTBL_RESULTATS.IdFactureReq,TBL_RESULTATS.CompteProduit,TBL_RESULTATS.IdCPEmetteur,TBL_RESULTATS.Analytique,TBL_RESULTATS.IdTauxTva,-- l'opération round permet d'éviter les problèmes d'arrondis avec le type money SUM(ROUND(TBL_RESULTATS.SommeReq,2)) * (-1) AS Montant,2 AS OrdreFROM(-- Grosse requete imbriquée) AS TBL_RESULTATSSachant que le compteur doit porter sur un seul IdFacture, mais que via mon insert j'ai plusieurs IdFacture qui passent.A côté de ça j'ai une autre table temporaire qui permet d'avoir un MontantTTC (nécessaire pour certains calcule sur toute les lignes). Bref, je ne sais pas trop comment faire, je pense peut être m'appuyer sur l'auto_increment et l'ordre (qui me permet de savoir quel ligne vient avant les autres). Si vous avez des idées je suis preneur Merci en tout cas de votre aide déjà précieuse snoopy et RinDman Lien vers le commentaire Partager sur d’autres sites More sharing options...
RinDman Posté(e) le 26 février 2014 Partager Posté(e) le 26 février 2014 On peut voir ton schéma de relation de cette BDD ? (Il est en cours de peaufinage ? ) Si j'ai bien cerné ton problème, moi j'aurais juste fait une table HT pour les factures, et je mettrais des fonctions pour afficher les version selon les différents TVA et TTC, voilà ma façon naïve de faire les choses ^^, tu peux les faire en faisant des SELECT, ça sera temporaire ou créer des vues, ça sera stocké comme des feuilles dans un répertoire ( Je pense c'est ce que t'essayes de faire non ? xP ) idfacture est la clé primaire que tu vas mettre en auto increment ( serial ). J'ai bien un cours où on doit traiter ces genre de cas, mais bon je doute bien que c'est loin d'être complet XD Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nemasix Posté(e) le 26 février 2014 Auteur Partager Posté(e) le 26 février 2014 Non IdFacture n'est pas une clé primaire. Le but de cette procédure est de faire des écritures comptables (le truc c'est que j'ai pas trop le droit de détailler toussa ) En gros après avec ma table temporaire, pour chaque ligne, je fais une écriture comptable D'où le fait d'écrire les HT, TVA et TTC :) Pour info le fichier que je suis en train de modifier fait quasi 1000 lignes (que du SQL, j'ai mal au crâne ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Dr.Jackson Posté(e) le 7 mars 2014 Partager Posté(e) le 7 mars 2014 Bonjour à tous, Utilise plutôt le rank(), il retourne un rang pour chaque ligne de résultat : http://msdn.microsoft.com/fr-fr/library/ms176102.aspx Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nemasix Posté(e) le 7 mars 2014 Auteur Partager Posté(e) le 7 mars 2014 En fait en regardant avec des collègues, j'ai utilisé ROW_NUMBER() OVER(PARTITION BY Id) J'ai l'impression que RANK() est quasi équivalent non? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.