Jump to content

Archived

This topic is now archived and is closed to further replies.

Nemasix

[SQL]Numéroter des éléments

Recommended Posts

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

Share this post


Link to post
Share on other sites

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 :transpi:

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...

Share this post


Link to post
Share on other sites

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 )

Share this post


Link to post
Share on other sites

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 :transpi:

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 ?

Share this post


Link to post
Share on other sites

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 :transpi:

Share this post


Link to post
Share on other sites

Voila mon idée qui fonctionne si tu peux garder la table tata mais vide:

Créer la table tata "temporaire" avec auto increment
Insé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?

Share this post


Link to post
Share on other sites

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 :chinois:

C'est parfait, je viens d'arriver au boulot. Merci encore :chinois:

Share this post


Link to post
Share on other sites

Bon bah en fait en parlant avec la chef de projet, je me rend compte que j'avais pas vraiment ciblé le problème :transpi:

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_RESULTATS
Sachant 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 :p

Merci en tout cas de votre aide déjà précieuse snoopy et RinDman

Share this post


Link to post
Share on other sites

On peut voir ton schéma de relation de cette BDD ? :p (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

Share this post


Link to post
Share on other sites

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 :craint: )

En gros après avec ma table temporaire, pour chaque ligne, je fais une écriture comptable :chinois:

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 :dd: )

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

×
×
  • Create New...