Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/09/2011, 08h32   #1
Débutant
 
Avatar de afrodje
 
Homme Jérémy
Développeur Web
Inscription : octobre 2006
Messages : 1 094
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 1 094
Points : 614
Points : 614
Par défaut Copie d'une colonne A vers colonne B

Bonjour,

J'essaie de copier la colonne T1.tarif vers la colonne T3.total_a_payer

Requête Table A
Code :
1
2
3
4
5
6
SELECT T1.facture,sum(T1.tarif) AS tarif
FROM	Facture_entete  AS T2
INNER JOIN  Table_tarif AS T1
ON T1.tarif= cast(T2.numero_facture AS int)
GROUP BY T1.facture
ORDER BY T1.facture ASC
Requête Table B
Code :
1
2
SELECT T3.numero_facture, T3.total_a_payer
FROM dbo.Facture_entete T3
Voici un aperçu de la requête Table A :

Code :
1
2
3
4
5
6
7
11252288	964
11252289	964
11252290	2892
11252291	964
11252292	1927
11252293	964
11252294	964

Voici un aperçu de la requête Table B :

Citation:
11252288 NULL
11252289 NULL
11252290 NULL
11252291 NULL
11252292 NULL
11252293 NULL
11252294 NULL

Après pas mal de tests d'UPDATE, je n'y arrive pas

Merci d'avance.
__________________
Évènements dans le 06?
www.sortir06.com
afrodje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 08h40   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
bonjour

Utilises une syntaxe du type

Code :
1
2
3
4
5
6
UPDATE T3.total_a_payer = (SELECT sum(T1.tarif) AS tarif
                                                   FROM Facture_entete  AS T2
                                                       INNER JOIN  Table_tarif AS T1
                                                         ON T1.tarif= cast(T2.numero_facture AS int 
WHERE T1.facture = t3.numero_facture)
FROM dbo.Facture_entete T3

Mais pourquoi avoir cette colonne "total_a_payer", alors qu'une requête te fournis le résultat à la volée ?
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 08h50   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Euh... petite erreur dans ta requête il me semble Olivier !
Je ferais plutôt comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
UPDATE T3
INNER JOIN
(
    SELECT T1.facture, SUM(T1.tarif) AS tarif
    FROM Facture_entete  AS T2
    INNER JOIN Table_tarif AS T1
        ON T1.tarif = cast(T2.numero_facture AS int)
    GROUP BY T1.facture
) A ON A.facture = CAST(T3.numero_facture AS INT)
SET T3.total_a_payer = A.tarif
Citation:
Mais pourquoi avoir cette colonne "total_a_payer", alors qu'une requête te fournis le résultat à la volée ?
Et pourquoi mettre un numéro de facture dans une colonne de type entier ?
Tu comptes additionner les numéros de facture ?
Tout ce qui est numéro, référence, matricule, code... ne faisant jamais l'objet de calculs doit être mis dans des colonnes CHAR ou VARCHAR !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 08h54   #4
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
oups

ah oui joli (je ne dois pas être du matin , allez café !)
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 09h16   #5
Débutant
 
Avatar de afrodje
 
Homme Jérémy
Développeur Web
Inscription : octobre 2006
Messages : 1 094
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 1 094
Points : 614
Points : 614
Citation:
Envoyé par dehorter olivier Voir le message
bonjour
Mais pourquoi avoir cette colonne "total_a_payer", alors qu'une requête te fournis le résultat à la volée ?
La requête 1 s’exécute sur un datawarehouse, et l'autre sur une base de "travail", donc pour optimiser le flux (et le temps d’exécution), je vais effectuer cette copie hors activité.

Citation:
Envoyé par CinePhil Voir le message
Euh... petite erreur dans ta requête Olivier !
Je ferais plutôt comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
UPDATE T3
INNER JOIN
(
    SELECT T1.facture, SUM(T1.tarif) AS tarif
    FROM Facture_entete  AS T2
    INNER JOIN Table_tarif AS T1
        ON T1.tarif = cast(T2.numero_facture AS int)
    GROUP BY T1.facture
) A ON A.facture = CAST(T3.numero_facture AS INT)
SET T3.total_a_payer = A.tarif
Je regarde cette requête de suite.
__________________
Évènements dans le 06?
www.sortir06.com
afrodje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 09h27   #6
Débutant
 
Avatar de afrodje
 
Homme Jérémy
Développeur Web
Inscription : octobre 2006
Messages : 1 094
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 1 094
Points : 614
Points : 614
Citation:
Envoyé par CinePhil Voir le message
Et pourquoi mettre un numéro de facture dans une colonne de type entier ?
Tu comptes additionner les numéros de facture ?
Tout ce qui est numéro, référence, matricule, code... ne faisant jamais l'objet de calculs doit être mis dans des colonnes CHAR ou VARCHAR !
Pas vu cette remarque

Je reprends à la base.
Notre base datawarehouse est issu de notre ERP.
Le champ du numéro de facture est un entier. Nous avons donc laissé les types de donnée par défaut...

Mais effectivement, je suis d'accord avec toi. Dans ma base de travail, ce champ est bien un VARCHAR
__________________
Évènements dans le 06?
www.sortir06.com
afrodje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 10h13   #7
Débutant
 
Avatar de afrodje
 
Homme Jérémy
Développeur Web
Inscription : octobre 2006
Messages : 1 094
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 1 094
Points : 614
Points : 614
Citation:
Envoyé par CinePhil Voir le message
Euh... petite erreur dans ta requête il me semble Olivier !
Je ferais plutôt comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
UPDATE T3
INNER JOIN
(
    SELECT T1.facture, SUM(T1.tarif) AS tarif
    FROM Facture_entete  AS T2
    INNER JOIN Table_tarif AS T1
        ON T1.tarif = cast(T2.numero_facture AS int)
    GROUP BY T1.facture
) A ON A.facture = CAST(T3.numero_facture AS INT)
SET T3.total_a_payer = A.tarif
J'ai une erreur... (sous SQL server)
Citation:
Serveur*: Msg 156, Niveau 15, État 1, Ligne 3
Syntaxe incorrecte vers le mot clé 'INNER'.
Serveur*: Msg 170, Niveau 15, État 1, Ligne 10
Ligne 10 : syntaxe incorrecte vers 'A'.
A quoi sert l'alias A?
__________________
Évènements dans le 06?
www.sortir06.com
afrodje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 10h28   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Je pense que c'est dû au fait que j'ai utilisé l'alias T3 de ta seconde requête au lieu du nom de la table facture_entete !
Correction :
Code :
1
2
3
4
5
6
7
8
9
10
UPDATE Facture_entete T3
INNER JOIN
(
    SELECT T1.facture, SUM(T1.tarif) AS tarif
    FROM Facture_entete  AS T2
    INNER JOIN Table_tarif AS T1
        ON T1.tarif = cast(T2.numero_facture AS int)
    GROUP BY T1.facture
) A ON A.facture = CAST(T3.numero_facture AS INT)
SET T3.total_a_payer = A.tarif
Ou alors, vu qu'il y a aussi une erreur de syntaxe près de A, peut-être SQL Server nécessite t-il AS pour tous les alias ?
Code :
1
2
3
4
5
6
7
8
9
10
UPDATE Facture_entete AS T3
INNER JOIN
(
    SELECT T1.facture, SUM(T1.tarif) AS tarif
    FROM Facture_entete  AS T2
    INNER JOIN Table_tarif AS T1
        ON T1.tarif = cast(T2.numero_facture AS int)
    GROUP BY T1.facture
) AS A ON A.facture = CAST(T3.numero_facture AS INT)
SET T3.total_a_payer = A.tarif
Citation:
A quoi sert l'alias A?
Comme je fais une jointure avec une sous-requête, il faut bien "aliasser" cette sous-requête pour écrire la condition de jointure !

Citation:
Notre base datawarehouse est issu de notre ERP.
Le champ du numéro de facture est un entier. Nous avons donc laissé les types de donnée par défaut...
Encore un ERP mal modélisé ! C'est lequel ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 11h07   #9
Débutant
 
Avatar de afrodje
 
Homme Jérémy
Développeur Web
Inscription : octobre 2006
Messages : 1 094
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 1 094
Points : 614
Points : 614
Citation:
Envoyé par CinePhil Voir le message
Encore un ERP mal modélisé ! C'est lequel ?
JD Edwards sous AS400.
__________________
Évènements dans le 06?
www.sortir06.com
afrodje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 11h30   #10
Débutant
 
Avatar de afrodje
 
Homme Jérémy
Développeur Web
Inscription : octobre 2006
Messages : 1 094
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 1 094
Points : 614
Points : 614
Merci pour les explications.

Cependant c'est assez bizarre... avec ou sans le AS, SQL server ne reconnait pas l'UPDATE.


Avec les 2 AS :
Citation:
Serveur*: Msg 156, Niveau 15, État 1, Ligne 1
Syntaxe incorrecte vers le mot clé 'as'.
Serveur*: Msg 156, Niveau 15, État 1, Ligne 9
Syntaxe incorrecte vers le mot clé 'AS'.
Sans les 2 AS :
Citation:
Serveur*: Msg 170, Niveau 15, État 1, Ligne 1
Ligne 1 : syntaxe incorrecte vers 'T3'.
Serveur*: Msg 170, Niveau 15, État 1, Ligne 9
Ligne 9 : syntaxe incorrecte vers 'A'.
__________________
Évènements dans le 06?
www.sortir06.com
afrodje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 11h33   #11
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Ça voudrait dire que SQL Server n'autorise pas les alias dans les UPDATE ?
Ou même les jointures car alors je ne vois pas comment faire avec la sous-requête !

Ou alors essaie comme ça avec des données test :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
UPDATE Facture_entete 
SET T3.total_a_payer = 
(
    SELECT tarif
    FROM
    (
        SELECT T1.facture, SUM(T1.tarif) AS tarif
        FROM Facture_entete  AS T2
        INNER JOIN Table_tarif AS T1
            ON T1.tarif = cast(T2.numero_facture AS int)
        GROUP BY T1.facture
    ) A
)
WHERE CAST(Facture_entete.numero_facture AS INT) = A.facture
Mais je trouve ça beaucoup plus lourd comme écriture de requête !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 11h39   #12
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 181
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 181
Points : 267
Points : 267
C'est peut etre plutot comme SYBASE qui n'autorise pas les tables dérivées dans le where d'un update
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 11h53   #13
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
On peut déjà commencer par la version simple :
Code :
1
2
3
4
UPDATE Facture_Entete AS T2
   SET T2.total_a_payer = (SELECT SUM(T1.tarif)
                             FROM Table_tarif AS T1
                            WHERE T1.facture = cast(T2.numero_facture AS int))
Attention celle-ci mettre systématiquement à jour toute la table Facture_Entete, mais je n'ai pas assez d'éléments ici pour appliquer un bon filtre.

Citation:
Envoyé par CinePhil Voir le message
Et pourquoi mettre un numéro de facture dans une colonne de type entier ?
Tu comptes additionner les numéros de facture ?
Tout ce qui est numéro, référence, matricule, code... ne faisant jamais l'objet de calculs doit être mis dans des colonnes CHAR ou VARCHAR !
Pas entièrement d'accord avec ce propos.

En ce qui concerne les numéros de factures (ou les identifiants au sens large), de très nombreuses applications les gèrent avec des entiers auto-incrémentés.
Il n'y a alors aucune raison de les transformer en varchar, même si on ne va pas faire d'opération mathématique dessus : ça consomme plus de place, ça réduit la performance des index, ça oblige à des conversions forcément coûteuses.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/09/2011, 12h03   #14
Débutant
 
Avatar de afrodje
 
Homme Jérémy
Développeur Web
Inscription : octobre 2006
Messages : 1 094
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 1 094
Points : 614
Points : 614
Citation:
Envoyé par CinePhil Voir le message
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
UPDATE Facture_entete 
SET T3.total_a_payer = 
(
    SELECT tarif
    FROM
    (
        SELECT T1.facture, SUM(T1.tarif) AS tarif
        FROM Facture_entete  AS T2
        INNER JOIN Table_tarif AS T1
            ON T1.tarif = cast(T2.numero_facture AS int)
        GROUP BY T1.facture
    ) A
)
WHERE CAST(Facture_entete.numero_facture AS INT) = A.facture
Mais je trouve ça beaucoup plus lourd comme écriture de requête !
Toujours une erreur, que ce soit avec ou sans le "AS" sur A

Citation:
Serveur*: Msg 107, Niveau 16, État 2, Ligne 1
Le préfixe de colonne 'A' ne correspond ni au nom de table ni au nom d'alias utilisés dans la requête.
Surement pas compatible avec notre version de SQL server 2000... (bon ok, une migration vers 2005 est prévu!)
__________________
Évènements dans le 06?
www.sortir06.com
afrodje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 12h08   #15
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Waldar Voir le message
En ce qui concerne les numéros de factures (ou les identifiants au sens large), de très nombreuses applications les gèrent avec des entiers auto-incrémentés.
Il n'y a alors aucune raison de les transformer en varchar, même si on ne va pas faire d'opération mathématique dessus : ça consomme plus de place, ça réduit la performance des index, ça oblige à des conversions forcément coûteuses.
Mais l'identifiant auto-incrémenté ne doit servir qu'à la salade interne du SGBD, notamment dans les jointures, et éventuellement comme identifiant masqué à l'utilisateur dans les programmes. Un identifiant auto-incrémenté n'a aucune signification et est invariable alors que, pour des raisons diverses (filialisation ou intégration de filiale, changement de codification...), un numéro, un code, une référence... peuvent changer de forme (aujourd'hui numérique, demain alphanumérique), voire de valeur.

"Allo, vous avez fait une grosse erreur sur la facture 8225 ! Il y a un zéro en trop !
- Oups, Effectivement ! Je vous corrige ça et je vous renvoie une facture 8225/A qui annule et remplace la 8225."
=>Impossible en utilisant l'identifiant auto-incrémenté comme numéro de facture.

"On doit intégrer dans notre ERP les données de gestion de la nouvelle filiale que le patron vient d'acheter. Problème : ils ont les mêmes numéros de factures que nous. Comment on fait ?"
=>Impossible en utilisant l'identifiant auto-incrémenté comme numéro de facture.

"On doit intégrer dans notre ERP les données de gestion de la nouvelle filiale que le patron vient d'acheter. Problème : ils ont des numéros de factures alphanumériques. Comment on fait ?"
=>Impossible en utilisant l'identifiant auto-incrémenté comme numéro de facture.

Je pourrais sans doute multiplier les exemples...

Le corollaire de l'article de SQLPro sur les clés auto-incrémentées est que celles-ci ne doivent servir que de clés primaires et être référencées dans les clés étrangères. Rien d'autre !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/09/2011, 12h25   #16
Débutant
 
Avatar de afrodje
 
Homme Jérémy
Développeur Web
Inscription : octobre 2006
Messages : 1 094
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 1 094
Points : 614
Points : 614
Citation:
Envoyé par Waldar Voir le message
On peut déjà commencer par la version simple :
Code :
1
2
3
4
UPDATE Facture_Entete AS T2
   SET T2.total_a_payer = (SELECT SUM(T1.tarif)
                             FROM Table_tarif AS T1
                            WHERE T1.tarif = cast(T2.numero_facture AS int))
Attention celle-ci mettre systématiquement à jour toute la table Facture_Entete, mais je n'ai pas assez d'éléments ici pour appliquer un bon filtre.
La requête fonctionne correctement.
J'ai rajouté un WHERE pour ne pas mettre jour à chaque fois
Code :
WHERE Facture_Entete.total_a_payer = ''

Citation:
Envoyé par Waldar Voir le message
Pas entièrement d'accord avec ce propos.
En ce qui concerne les numéros de factures (ou les identifiants au sens large), de très nombreuses applications les gèrent avec des entiers auto-incrémentés.
Il n'y a alors aucune raison de les transformer en varchar, même si on ne va pas faire d'opération mathématique dessus : ça consomme plus de place, ça réduit la performance des index, ça oblige à des conversions forcément coûteuses.
Par contre, je ne suis pas pour les identifiants (facture, BL, commande,....) avec la clé autoincrément. (je rejoins l'avis de CinéPhil).
Les identifiants entier permet de simplifier le développement (pas de test si existe déjà, index...), c'est vrai mais peut brider l'application si un imprévu arrive (exemples déjà cités)
De plus, tu trouveras le numéro de facture par exemple "122". 5 ans après tu trouveras une facture "8751874".
Trop de différence en nombre de caractère...

Pour ma part, un numéro avec préfixe + date + heure + incrément sur 3 ou 4 digits permet d'avoir toujours la même structure
(BL201109150002, permet d'avoir aussi des infos sans même interroger l'ERP)
__________________
Évènements dans le 06?
www.sortir06.com
afrodje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 12h25   #17
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par CinePhil Voir le message
Mais l'identifiant auto-incrémenté ne doit servir qu'à la salade interne du SGBD, notamment dans les jointures, et éventuellement comme identifiant masqué à l'utilisateur dans les programmes.
Mais soit j'ai rêvé soit ici on parle bien d'un numéro de facture permettant de faire des jointures ?

Citation:
Envoyé par afrodje Voir le message
Pour ma part, un numéro avec préfixe + date + heure + incrément sur 3 ou 4 digits permet d'avoir toujours la même structure
(BL201109150002, permet d'avoir aussi des infos sans même interroger l'ERP)
Oui, je n'ai aucun problème avec ceci à condition que ce ne soit pas ce code qui soit référencé dans les autres tables.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 12h47   #18
Débutant
 
Avatar de afrodje
 
Homme Jérémy
Développeur Web
Inscription : octobre 2006
Messages : 1 094
Détails du profil
Informations personnelles :
Nom : Homme Jérémy
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 1 094
Points : 614
Points : 614
Citation:
Envoyé par Waldar Voir le message
Oui, je n'ai aucun problème avec ceci à condition que ce ne soit pas ce code qui soit référencé dans les autres tables.
Bien sur que non, règle des clés étrangères
__________________
Évènements dans le 06?
www.sortir06.com
afrodje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 13h24   #19
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Waldar Voir le message
Mais soit j'ai rêvé soit ici on parle bien d'un numéro de facture permettant de faire des jointures ?
Si on parle d'un numéro de facture, on parle d'un truc signifiant qui sera imprimé sur la facture physique envoyée au client et lui servira de référence en cas de réclamation ou pour accompagner son paiement. Il ne s'agit alors pas d'un [u]identifiant[/iu] de facture, clé primaire de la table des factures, sans signification et jamais montré à l'utilisateur.

Or, justement, ce que je critique, c'est qu'il semble bien que nous soyons ici en présence d'un identifiant auto-incrémenté qui sert de numéro de facture physique.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h59.


 
 
 
 
Partenaires

Hébergement Web