Cher forum,

Je cherche à créer un tableau composé d'écritures comptables, qui sera envoyé dans un csv.
Pour chaque enregistrement en BDD, on crée deux lignes à exporter : un débit et un crédit.
Voici ce que j'ai fait pour l'instant :

    header('Content-Type: text/csv; charset=utf-8');  
    header('Content-Disposition: attachment; filename="' . $filename . '"');  
    header('Expires: 0');
    header("Pragma: no-cache");
    $output = fopen("php://output", "w"); 

    fputcsv($output, array('num_ecriture', 'code_journal', 'date', 'num_facture', 'compte_comptable', 'compte_auxiliaire', 'libelle', 'debit', 'credit'), ";");  
    $sql_export = "SELECT * from " . $_SESSION["table"] . " ORDER BY date, num_facture DESC";  
    $result_export = mysqli_query($mysqli, $sql_export);  
    if(!mysqli_query($mysqli, $sql_export))
    {
        echo "alerte : Erreur EXPORT MySQL sur la table " .$_SESSION["table"] ."";    
    } else
    {
        while($row = mysqli_fetch_array($result_export))  
        {

            if ($_SESSION["fis_ref"] == "REP")
            {
                if ($row['moyen_de_paiement'] == "carte bancaire")
                {
                    $cj = "RCB";
                    $date = date("d/m/Y", strtotime($row['date']));
                    $fact = $row['num_facture'];
                    $lib = utf8_decode($row['client_fournisseur']);
                    $montant = str_replace('.', ',', $row['montant']);	
                    $dc = $row['debit_credit'];

                    // Règlements
                    if (substr($row['note'], 0, 6) == "Stripe") {
                    $cc = 58050000;
                    } else {
                    $cc = 58030000;
                    }
                    
                    $cptea = $row['compte_auxiliaire'];
                    
                    if ($dc == "credit") {
                    $debit = $montant;
                    $credit = "";
                    } else if ($dc == "debit") {
                    $debit = "";
                    $credit = $montant;
                    }

                    $export1 = array($fact, $cj, $date, $fact, $lib, $cc, $cptea, $debit, $credit);

                    // Contrepartie règlements
                    $cptec = $row['compte_tiers'];
                    $cptea = $row['compte_auxiliaire'];
                    if (substr($cptec,0,3) == "411") {
                    $cc = $cptea;
                    } else {
                    $cc = $cptec;
                    }

                    if ($dc == "credit") {
                    $debit = "";
                    $credit = $montant;
                    } else if ($dc == "debit") {
                    $debit = $montant;
                    $credit = "";
                    }

                    $export2 = array($fact, $cj, $date, $fact, $lib, $cc, $cptea, $debit, $credit);
                }

                $export = array_merge($export1, $export2);
                fputcsv($output, $export, ";");
            } 

Au bout du compte, au lieu d'avoir 17 écritures (soit 34 lignes), j'ai deux tableaux côte à côte et des doublons... Smiley sweatdrop

HELP please !
Bonjour,

Je m'aperçois que l'image de l'export .csv que j'avais postée dans le premier post, et bien je ne l'ai pas postée... La voici cette fois ! Elle montre les lignes en doublons (en rouge).

Et voici la fin du script que j'ai modifié. Au moins, maintenant toutes les données sont bien listées dans le tableau, mais avec les doublons... :

       while($row = mysqli_fetch_array($result_export))  
        {
            if ($_SESSION["fis_ref"] == "REP")
            {
                if ($row['moyen_de_paiement'] === "carte bancaire")
                {
                    $cj = "RCB";
                    $date = date("d/m/Y", strtotime($row['date']));
                    $fact = $row['num_facture'];
                    $lib = $row['client_fournisseur'];
                    $montant = str_replace('.', ',', $row['montant']);	
                    $dc = $row['debit_credit'];

                    // Règlements
                    if (substr($row['note'], 0, 6) == "Stripe") {
                        $cc = 58050000;
                    } else {
                        $cc = 58030000;
                    }             
                    $cptea = $row['compte_auxiliaire'];                
                    if ($dc == "credit") {
                        $debit = $montant;
                        $credit = "";
                    } else if ($dc == "debit") {
                        $debit = "";
                        $credit = $montant;
                    }
                    $ligne1 = array($fact, $cj, $date, $fact, $lib, $cc, $cptea, $debit, $credit);

                    // Contrepartie règlements
                    $cptec = $row['compte_tiers'];
                    $cptea = $row['compte_auxiliaire'];
                    if (substr($cptec,0,3) == "411") {
                        $cc = $cptea;
                    } else {
                        $cc = $cptec;
                    }
                    if ($dc == "credit") {
                        $debit = "";
                        $credit = $montant;
                    } else if ($dc == "debit") {
                        $debit = $montant;
                        $credit = "";
                    }
                    $ligne2 = array($fact, $cj, $date, $fact, $lib, $cc, $cptea, $debit, $credit);
                }
                $exp = array($ligne1, $ligne2);
                foreach ($exp as $export)
                {
                    fputcsv($output, $export, ";");
                }

Je ne sais pas du tout quoi faire... Smiley sweatdrop Auriez-vous une idée ?
Goo
Bon, l'image ne s'affiche pas alors qu'elle fait moins de 300Ko...
Si quelqu'un peut me dire quoi faire ...
Salut,

je ne suis pas sur de bien comprendre tout ton traitement, mais du peu que j'en comprends... ce n'est pas plus simple de sortir une requête qui sort les bonnes infos plutôt que de sortir toutes les données de la table et de les traiter une par une ensuite ?

Perso quand je vois :

$sql_export = "SELECT * from " . $_SESSION["table"] . " ORDER BY date, num_facture DESC";

puis

if ($row['moyen_de_paiement'] == "carte bancaire")


Je ferais directement :

$sql_export = "SELECT * from " . $_SESSION["table"] . " WHERE moyen_de_paiement="carte bancaire" ORDER BY date, num_facture 


Pour les autres il faudrait réfléchir un poil plus (et voir si ça vaut le coup de le faire ou pas) mais à mon avis pareil cela doit pouvoir sortir directement de la bdd aussi.
Genre crédit / débit, soit faire 2 sous requêtes qui gère un cas chacun et que tu enchaînes, soit faire un union de requête et gérer directement chaque cas dedans :

SELECT *, 0 as credit , montant as debit from " . $_SESSION["table"] . " WHERE moyen_de_paiement="carte bancaire" and debit_credit= "debit"
UNION 
SELECT *, montant as credit, 0 as debit from " . $_SESSION["table"] . " WHERE moyen_de_paiement="carte bancaire" and debit_credit= "credit"
ORDER BY date, num_facture DESC";d

Modifié par Mathieuu (04 Oct 2022 - 16:24)
Meilleure solution
Un grand merci pour ton retour constructif Mathieuu !
Je pensais que le problème venait de PHP alors que c'était une histoire de MySQL...
'va falloir que je m'investisse un peu plus sur la partie BDD pour optimiser le PHP.
Bon, déjà, je suis passé en PDO donc le code a changé depuis le premier post.
Voici ce que ça donne :
 $requete = $bdd->prepare("
SELECT *, 0 as credit , montant as debit FROM " . $_SESSION["table"] . " WHERE moyen_de_paiement= :mp1 AND debit_credit= :dc1 
UNION SELECT *, montant as credit, 0 as debit FROM " . $_SESSION["table"] . " WHERE moyen_de_paiement= :mp2 AND debit_credit= :dc2 ORDER BY date, num_facture ASC");
$requete->execute(array('mp1' => 'carte bancaire', 
                                          'dc1' => 'debit', 
                                           'mp2' => 'carte bancaire', 
                                           'dc2' => 'credit'));