Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Génération de fichier - boucle?

3 réponses
Avatar
Marc
Bonjour,

Je génere un fichier texte via une requête par une instruction select:
SELECT champ1, champ2 FROM table1, table2 GROUP BY.....

Mon pb est le suivant:
Dans le résultat de la requête, je désire répéter certaines lignes en
fonction de la valeur prise par un champ précis (DO_COLISAGE).
Plus explicitement, je genere des lignes qui permettent l'impression des
étiquettes destinées à l'expédition des colis. Chaque expédition génère une
ligne dans le résultat de la requête. Or pour une même expédition je peux
avoir plusieurs colis.
Donc à chaque fois que le champ DO_COLISAGE (renseigne le nombre de colis)
est supérérieur à 1, j'aimerais obtenir dans le résultat de la requête,
autant de ligne qu'il y a de colis. Si il y a 2 colis je dois avoir deux fois
la meme ligne. 3 Colis, 3 fois la meme ligne etc. (Je n'expédie jamais + de
20 colis pour la meme livraison).

J'espère avoir été clair!

Si quelqu'un peut m'aider, j'en serais trés heureux.
Merci à tous pour votre contribution.


-----
Marc

3 réponses

Avatar
synopsis
Il faut tout d'abord une crée une table Chiffre, que tu alimentes de 0 à 9.



Create table chiffre
(
value tinyint not null
, constraint pk_chiffre primary key (value)
)

go

set nocount on
insert chiffre values(0)
insert chiffre values(1)
insert chiffre values(2)
insert chiffre values(3)
insert chiffre values(4)
insert chiffre values(5)
insert chiffre values(6)
insert chiffre values(7)
insert chiffre values(8)
insert chiffre values(9)

//

La requête ci-dessous te renvoie tous les nombres de 1 à 99 :

Select u.value + 10 * v.value nombre
From chiffre u cross join chiffre v
Where u.value + 10 * v.value>0

Produit cartésien : [colis ] x [1-99] tel que nombre <= colisage

Select a.id_colis, b.nombre, colisage
From colis a
Join (
select u.value + 10 * v.value nombre
from chiffre u cross join chiffre v
) b on (b.nombre<=a.colisage)
Order by a.id_colis, b.nombre, a.colisage



"Marc" a écrit dans le message de news:

Bonjour,

Je génere un fichier texte via une requête par une instruction select:
SELECT champ1, champ2 FROM table1, table2 GROUP BY.....

Mon pb est le suivant:
Dans le résultat de la requête, je désire répéter certaines lignes en
fonction de la valeur prise par un champ précis (DO_COLISAGE).
Plus explicitement, je genere des lignes qui permettent l'impression des
étiquettes destinées à l'expédition des colis. Chaque expédition génère
une
ligne dans le résultat de la requête. Or pour une même expédition je peux
avoir plusieurs colis.
Donc à chaque fois que le champ DO_COLISAGE (renseigne le nombre de colis)
est supérérieur à 1, j'aimerais obtenir dans le résultat de la requête,
autant de ligne qu'il y a de colis. Si il y a 2 colis je dois avoir deux
fois
la meme ligne. 3 Colis, 3 fois la meme ligne etc. (Je n'expédie jamais +
de
20 colis pour la meme livraison).

J'espère avoir été clair!

Si quelqu'un peut m'aider, j'en serais trés heureux.
Merci à tous pour votre contribution.


-----
Marc


Avatar
Marc
Merci pour cette réponse, sincèrement.
Je n'ai pas tout compris, mais j'espère qu'en passant un peu de temps, je
vais y arriver.
Merci

--
Marc


"synopsis" a écrit :

Il faut tout d'abord une crée une table Chiffre, que tu alimentes de 0 à 9.



Create table chiffre
(
value tinyint not null
, constraint pk_chiffre primary key (value)
)

go

set nocount on
insert chiffre values(0)
insert chiffre values(1)
insert chiffre values(2)
insert chiffre values(3)
insert chiffre values(4)
insert chiffre values(5)
insert chiffre values(6)
insert chiffre values(7)
insert chiffre values(8)
insert chiffre values(9)

//

La requête ci-dessous te renvoie tous les nombres de 1 à 99 :

Select u.value + 10 * v.value nombre
From chiffre u cross join chiffre v
Where u.value + 10 * v.value>0

Produit cartésien : [colis ] x [1-99] tel que nombre <= colisage

Select a.id_colis, b.nombre, colisage
From colis a
Join (
select u.value + 10 * v.value nombre
from chiffre u cross join chiffre v
) b on (b.nombre<=a.colisage)
Order by a.id_colis, b.nombre, a.colisage



"Marc" a écrit dans le message de news:

> Bonjour,
>
> Je génere un fichier texte via une requête par une instruction select:
> SELECT champ1, champ2 FROM table1, table2 GROUP BY.....
>
> Mon pb est le suivant:
> Dans le résultat de la requête, je désire répéter certaines lignes en
> fonction de la valeur prise par un champ précis (DO_COLISAGE).
> Plus explicitement, je genere des lignes qui permettent l'impression des
> étiquettes destinées à l'expédition des colis. Chaque expédition génère
> une
> ligne dans le résultat de la requête. Or pour une même expédition je peux
> avoir plusieurs colis.
> Donc à chaque fois que le champ DO_COLISAGE (renseigne le nombre de colis)
> est supérérieur à 1, j'aimerais obtenir dans le résultat de la requête,
> autant de ligne qu'il y a de colis. Si il y a 2 colis je dois avoir deux
> fois
> la meme ligne. 3 Colis, 3 fois la meme ligne etc. (Je n'expédie jamais +
> de
> 20 colis pour la meme livraison).
>
> J'espère avoir été clair!
>
> Si quelqu'un peut m'aider, j'en serais trés heureux.
> Merci à tous pour votre contribution.
>
>
> -----
> Marc





Avatar
Timur
La 'ruse' de synopsis permet de gérer 99 colis dans pour autant créer 99
lignes dans la table chiffre ... mais du coup ça complique un peu la requête
!

Dans ton cas, si tu es limité à 20 colis, tu crée effectivement la table
chiffre avec une seule colonne 'valeur',
tu crée 20 enregistrements de 1 à 20 dans le champ valeur

et avec la requête


select * from colis
join chiffre
on chiffre.valeur <= colis.DO_COLISAGE


Si tu as 5 dans DO_COLISAGE, il va te faire une jointure avec 5
enregistrements dans chiffre (1,2,3,4 et 5) et donc te retourner 5 lignes !
Le champ colis.valeur peut même te servir à numéroter tes colis !! ;-)



--
Cordialement



"Marc" a écrit dans le message de
news:
Merci pour cette réponse, sincèrement.
Je n'ai pas tout compris, mais j'espère qu'en passant un peu de temps, je
vais y arriver.
Merci

--
Marc


"synopsis" a écrit :

> Il faut tout d'abord une crée une table Chiffre, que tu alimentes de 0 à


9.
>
>
>
> Create table chiffre
> (
> value tinyint not null
> , constraint pk_chiffre primary key (value)
> )
>
> go
>
> set nocount on
> insert chiffre values(0)
> insert chiffre values(1)
> insert chiffre values(2)
> insert chiffre values(3)
> insert chiffre values(4)
> insert chiffre values(5)
> insert chiffre values(6)
> insert chiffre values(7)
> insert chiffre values(8)
> insert chiffre values(9)
>
> //
>
> La requête ci-dessous te renvoie tous les nombres de 1 à 99 :
>
> Select u.value + 10 * v.value nombre
> From chiffre u cross join chiffre v
> Where u.value + 10 * v.value>0
>
> Produit cartésien : [colis ] x [1-99] tel que nombre <= colisage
>
> Select a.id_colis, b.nombre, colisage
> From colis a
> Join (
> select u.value + 10 * v.value nombre
> from chiffre u cross join chiffre v
> ) b on (b.nombre<=a.colisage)
> Order by a.id_colis, b.nombre, a.colisage
>
>
>
> "Marc" a écrit dans le message de news:
>
> > Bonjour,
> >
> > Je génere un fichier texte via une requête par une instruction select:
> > SELECT champ1, champ2 FROM table1, table2 GROUP BY.....
> >
> > Mon pb est le suivant:
> > Dans le résultat de la requête, je désire répéter certaines lignes en
> > fonction de la valeur prise par un champ précis (DO_COLISAGE).
> > Plus explicitement, je genere des lignes qui permettent l'impression


des
> > étiquettes destinées à l'expédition des colis. Chaque expédition


génère
> > une
> > ligne dans le résultat de la requête. Or pour une même expédition je


peux
> > avoir plusieurs colis.
> > Donc à chaque fois que le champ DO_COLISAGE (renseigne le nombre de


colis)
> > est supérérieur à 1, j'aimerais obtenir dans le résultat de la


requête,
> > autant de ligne qu'il y a de colis. Si il y a 2 colis je dois avoir


deux
> > fois
> > la meme ligne. 3 Colis, 3 fois la meme ligne etc. (Je n'expédie jamais


+
> > de
> > 20 colis pour la meme livraison).
> >
> > J'espère avoir été clair!
> >
> > Si quelqu'un peut m'aider, j'en serais trés heureux.
> > Merci à tous pour votre contribution.
> >
> >
> > -----
> > Marc
>
>
>