Avatar billede lsskaarup Nybegynder
31. marts 2005 - 08:35 Der er 22 kommentarer og
1 løsning

Sortering af dato, "tomme" datoer skal komme sidst

Ja, faktisk ved jeg ikke om spørgsmålet skulle have været i MySQL-kategorien, hvis det kan klares via select-sætningen, må I sige til, så jeg kan oprette spg. det rette sted. Men jeg vil mene, at det er her, der er størst mulighed for at få hjælp til en løsning.

Jeg har en select-sætning, der henter nogle ordreoplysninger ud bl.a. diverse datoer, disse sortere jeg stigende, og der kommer de tomme datoer jo selvfølgelig først. Problemet er at brugerne af systemet, vil have ordrene, som ikke har en dato endnu, til at komme sidst i søgning, men samtidig skal den førstkommende dato jo komme først.

Kan det løses via php og hvordan, eventuelt i SQL, men som jeg skrev, så skal jeg nok flyttet spørgsmålet, hvis det er aktuelt.
Avatar billede sostack Nybegynder
31. marts 2005 - 09:11 #1
while($ordrelinie = mysql_fetch_assoc($result))
{
  if("" == $ordrelinie["dato"])
  {
      $tomme[] = $ordrelinie;
  } else {
      $med_dato = $ordrelinie;
  }
}
$ordrelinier = array_merge($med_dato, $tomme);

Nu ligger alle linier med "tomme" datoer til sidst i arrayet $ordrelinier.

//sostack
Avatar billede lsskaarup Nybegynder
31. marts 2005 - 09:32 #2
Okay, jeg har nu tilpasset scriptet, men kan ikke få det til at virke helt efter hensigten.

Det ser sådanne ud
while ($foo = mysql_fetch_assoc($sql)) {
    if("" == $foo["r531b"] || "0000-00-00" == $foo["r531b"]) {
        $tomme[] = $foo;
    } else {
        $med_dato = $foo;
    }
        //}
    $foo = array_merge($med_dato, $tomme);

?>
<tr>

<td class="content" valign="top" style="width: 50px; text-align: right;">
    <a href="java script:newWindow=openWin('/popupordre/ordre12/<?php echo $foo['id']; ?>/','pop2Win<?php echo $foo['id']; ?>');newWindow.focus();">
        <?php echo $foo['ordre']; if ($foo['rev'] > 0) echo " R".$foo['rev']; ?>
    </a>
</td>

<?php
//optegn ugenr og dags nr
$optegn = $foo['optegnuge']."-".$foo['optegndag'];
if (!isset($foo['optegnuge'])) {
    $foo['optegnuge'] = "";
    $optegn = "";   
}?>
<td class="content" valign="top" style="text-align: right";><?php echo $optegn;?></td>

.
.
.//Forsætte med at skrive de forskellige værdier ud
.

Men kan det ikke skyldes, at jeg med det "tomme" mente datoerne 0000-00-00, de kommer jo stadigvæk først, og hvis jeg som her har tilføjet 0000-00-00 i if-sætningen, så får jeg en masse tomme rækker før selve indholdet kommer.
Avatar billede lsskaarup Nybegynder
31. marts 2005 - 09:42 #3
Men det kan være sorteringen bliver mere indviklet, for som standard skal der først sorteres på dato (r531b) derefter id. Derudover kan brugeren klikke på nogle kolonneoverskrifter og så ordrene sorteret efter disse.

De ekstra sorteringer vil så se sådanne ud.
1) id, r531b, id
2) r531b, r531b, id //som også er standard
3) r533c, r531b, id
4) r1, r531b, id

Og ja, der er noget dobbeltkonfekt i 1 og 2, men sådan ser det altså ud pt, og det virker bort set fra problemet med datoerne.
Avatar billede lsskaarup Nybegynder
31. marts 2005 - 09:44 #4
Hvis det kan hjælpe noget er selecten her:

SELECT o5.r531b, o.id AS id, o.ordre AS ordre, o.rev AS rev, o0.r9 AS kunde, o0.r1 AS projektleder, WEEKOFYEAR(o5.r533c) AS levuge, WEEKDAY(r533c)+1 AS levdag, o5.r541, WEEKOFYEAR(o5.r540a) AS staaluge, WEEKDAY(o5.r540a)+1 AS staaldag, WEEKDAY(o5.r542a)+1 AS stadag, WEEKOFYEAR(o5.r542a) AS stauge, WEEKOFYEAR(o5.r543a) AS teguge, WEEKDAY(o5.r543a)+1 AS tegdag, o5.r537, o5.r538, WEEKOFYEAR(o5.r547a) AS sendtuge, WEEKDAY(o5.r547a)+1 AS sendtdag, WEEKOFYEAR(o5.r545a) AS godkuge, WEEKDAY(o5.r545a)+1 AS godkdag, o5.r570, WEEKOFYEAR(o5.r531b) AS optegnuge, WEEKDAY(o5.r531b)+1 AS optegndag
FROM ordre AS o, ordre0 AS o0 LEFT JOIN ordre5 AS o5 ON o0.tilbudsnummer = o5.tilbudsnummer
WHERE o0.tilbudsnummer = o.id && ( o5.r534 =0 || o5.r534 IS NULL ) && o5.r534a !=1 && ( o5.r534b !=1 || o5.r534b IS NULL ) ORDER BY $sort, o.id ASC

$sort er så den der blvier udskiftet alt efter hvilken sortering der skal bruges.
Avatar billede lsskaarup Nybegynder
31. marts 2005 - 09:46 #5
Hov, jeg var vidst lidt for hurtigt med seksløberen, men hensyn til kommentaren 31/03-2005 09:42:11.

Den skulle se sådan ud:
1) id, id
2) r531b, id //som også er standard
3) r533c, id
4) r1, id
Avatar billede lsskaarup Nybegynder
31. marts 2005 - 09:52 #6
Okay, de ekstra tomme, der pludselig kom, kan skyldes at der var [] på $tomme. Jeg har i hvert fald fjernet dem, og så forsvinder de tomme række i outputtet.
Avatar billede lsskaarup Nybegynder
31. marts 2005 - 09:55 #7
Nå, det var så ikke helt rigtigt alligevel, da den sidste ordre, nu gentages mange gange.
Avatar billede lsskaarup Nybegynder
31. marts 2005 - 10:02 #8
Hov, de tomme rækker jeg omtaler, skal faktisk være der, men jeg får overhovedet ingen oplysninger ud om dem, og de skal stadig vise, alle tilgængelige info.

Jeg kan desværre ikke vise outputtet, da opsætningen simpelthen er for stor til E.
Avatar billede sostack Nybegynder
31. marts 2005 - 10:07 #9
while ($foo = mysql_fetch_assoc($sql)) {
    if("" == $foo["r531b"] || "0000-00-00" == $foo["r531b"]) {
        $tomme[] = $foo;
    } else {
        $med_dato = $foo;
    }
        //} <--- Fejl her // skal væk!!
    $foo = array_merge($med_dato, $tomme);

?>

//sostack
Avatar billede sostack Nybegynder
31. marts 2005 - 10:12 #10
while ($foo = mysql_fetch_assoc($sql)) {
    if("" == $foo["r531b"] || "0000-00-00" == $foo["r531b"]) {
        $tomme[] = $foo;
    } else {
        $med_dato[] = $foo;
    }
  }
$foo = array_merge($med_dato, $tomme);

Med rettelser!
Avatar billede lsskaarup Nybegynder
31. marts 2005 - 10:15 #11
Det er sådan den ser ud, men jeg får altså ingen date ud om de ordre som har en "tom" dato.

Når de 2 arrays merges, burde der da ikke ske noget med navngivningen af felterne?

Så det er ikke fordi jeg  f.eks. bare siger echo $foo['kunde']; og der ved de "tomme" ordre ikke blvier overførte noget felt med navnet 'kunde'?
Avatar billede sostack Nybegynder
31. marts 2005 - 10:15 #12
Med den seneste rettelse indeholder dit array $foo nu alle dine ordrelinier som arrays. Dem skal du løbe igennem og hente oplysningerne ud af.

//sostack
Avatar billede lsskaarup Nybegynder
31. marts 2005 - 10:17 #13
Tjekker lige din sidste rettelse ud, da jeg ikke havde set den, da jeg postede mit indlæg
Avatar billede sostack Nybegynder
31. marts 2005 - 10:20 #14
while ($foo = mysql_fetch_assoc($sql)) {
    if("" == $foo["r531b"] || "0000-00-00" == $foo["r531b"]) {
        $tomme[] = $foo;
    } else {
        $med_dato[] = $foo;
    }
}
$fool = array_merge($med_dato, $tomme);
for($i = 0; $i < count($fool); $i++)
{
$foo = $fool[$i];
?>
<tr>

<td class="content" valign="top" style="width: 50px; text-align: right;">
    <a href="java script:newWindow=openWin('/popupordre/ordre12/<?php echo $foo['id']; ?>/','pop2Win<?php echo $foo['id']; ?>');newWindow.focus();">
        <?php echo $foo['ordre']; if ($foo['rev'] > 0) echo " R".$foo['rev']; ?>
    </a>
</td>

<?php
//optegn ugenr og dags nr
$optegn = $foo['optegnuge']."-".$foo['optegndag'];
if (!isset($foo['optegnuge'])) {
    $foo['optegnuge'] = "";
    $optegn = "";   
}?>
<td class="content" valign="top" style="text-align: right";><?php echo $optegn;?></td>
.
.
.//Forsætte med at skrive de forskellige værdier ud
.


Skulle virke!
Avatar billede lsskaarup Nybegynder
31. marts 2005 - 10:41 #15
Nej desværre. Den viser ordrene med tomme datoer korrekt un, men tilgengæld vises alle de andre ordre ikke. Derudover vises der en masse række indeholdende data, som jeg ikke lige nu kan genkende, måske ordre med datoer, som ikke bliver vidst korrekt. Til sidst er der stadig en masse helt tomme rækker.
Avatar billede lsskaarup Nybegynder
31. marts 2005 - 10:44 #16
Men alle ordrene er heller ikke i $fool, da count kun returnere 73 rækker, og selve selecten returnere 127 rækker
Avatar billede lsskaarup Nybegynder
31. marts 2005 - 10:45 #17
Ups, det var mig, jeg havde glemt at få [] på $med_dato[] = $foo;
Avatar billede sostack Nybegynder
31. marts 2005 - 10:47 #18
Har du rettet til:
if("" == $foo["r531b"] || "0000-00-00" == $foo["r531b"]) {
        $tomme[] = $foo;
    } else {
        $med_dato[] = $foo;
    }
Både $tomme og $med_dato skal have [] på !!!!

//sostack
Avatar billede lsskaarup Nybegynder
31. marts 2005 - 10:50 #19
Ja, nu virker det, tak for hjælpen.
Avatar billede sostack Nybegynder
31. marts 2005 - 10:53 #20
Oki!

//sostack
Avatar billede lsskaarup Nybegynder
31. marts 2005 - 11:00 #21
Lægger du et svar
Avatar billede sostack Nybegynder
31. marts 2005 - 11:01 #22
Jep!

//sostack
Avatar billede lsskaarup Nybegynder
28. april 2005 - 10:24 #23
Ja, sostack, jeg må have fået gjort et eller andet helt vildt dumt, for nu virker det ikke alligevel. Jeg har derfor oprettet et nyt spørgsmål, som du eventuelt kan svare på og tjene flere point ;-) http://www.eksperten.dk/spm/613681
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester