Bestaat er binnen PHP iets als continue zoals in Java of is dat GOTO?
Ik zit min of meer met een volgorde probleem en ik probeer het hieronder in de code uit te leggen/beschrijven. Ik had gedacht dat ik het nooit zou gaan toe passen 'continue <label>'. Is in PHP het statement GOTO de vervanger of... kun je het syntaxis wat netter oplossen?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
$SQLMainQuery = "SELECT...";
$RSM=($con, $SQLMainQuery)
while (odbc_fetch_array($ResultMainQuery) {
current_main_key_value =
Label_Continue:
if (previous_key_value !== current_main_key_value) {
$SQLSubQuery = "SELECT... FROM VIEW WHERE Subquery_value = Mainquery_value";
$RSS=($con, $SQLSubQuery)
//Doe vullen array met sub query waarden
}
previous_key_value = current_main_key_value;
//Doe vullen array MAIN query gegevens
// Zoals je ziet is de WHERE clause van de sugquery afhankelijk van de Main query "WHERE Subquery_value
// = Mainquery_value"
//
// HET PROBLEEM ZIT HEM IN HET LAATSTE MAIN RECORD, WANT DAN WIL JE NOG KIJKEN OF HET ARRAY NOG
// AANGEVULD MOET WORDEN MET SUB QUERY GEGEVENS. Het punt is dat voor de main query je weet niet wanneer
// het laatste record voor een bepaalde key waarde bereikt is, het aantal is voor een bepaalde key
// waarde van een regel verschillend aantal records voor een bepaalde key value gereturned worden.
// LET OP: wat ik bedoel met het aantal records voor een zekere key waarde zijn de afzonderlijke records
// binnen de main query en is een ander aantal dat het totale aantal records van de main query
// Dus zat ik te denken wat in JAVA bestaat "Continue" dus:
continue Label_Continue; //Voer de subquery uit en kijk of de main recods nog aangevuld moeten worden
// Of is dat het bekende 'basic' syntax "GOTO"
}
?>
$SQLMainQuery = "SELECT...";
$RSM=($con, $SQLMainQuery)
while (odbc_fetch_array($ResultMainQuery) {
current_main_key_value =
Label_Continue:
if (previous_key_value !== current_main_key_value) {
$SQLSubQuery = "SELECT... FROM VIEW WHERE Subquery_value = Mainquery_value";
$RSS=($con, $SQLSubQuery)
//Doe vullen array met sub query waarden
}
previous_key_value = current_main_key_value;
//Doe vullen array MAIN query gegevens
// Zoals je ziet is de WHERE clause van de sugquery afhankelijk van de Main query "WHERE Subquery_value
// = Mainquery_value"
//
// HET PROBLEEM ZIT HEM IN HET LAATSTE MAIN RECORD, WANT DAN WIL JE NOG KIJKEN OF HET ARRAY NOG
// AANGEVULD MOET WORDEN MET SUB QUERY GEGEVENS. Het punt is dat voor de main query je weet niet wanneer
// het laatste record voor een bepaalde key waarde bereikt is, het aantal is voor een bepaalde key
// waarde van een regel verschillend aantal records voor een bepaalde key value gereturned worden.
// LET OP: wat ik bedoel met het aantal records voor een zekere key waarde zijn de afzonderlijke records
// binnen de main query en is een ander aantal dat het totale aantal records van de main query
// Dus zat ik te denken wat in JAVA bestaat "Continue" dus:
continue Label_Continue; //Voer de subquery uit en kijk of de main recods nog aangevuld moeten worden
// Of is dat het bekende 'basic' syntax "GOTO"
}
?>
Nico
EDIT: zoals ik het zie heb je een soort van verzameling A en een verzameling B en in verzameling B zitten meerdere items die bij één item van A horen. Met een query op verzameling A met een LEFT JOIN op B kun je in 1x alle gewenste informatie ophalen. Het uitsplitsen van resultaten in een array kun je on-the-fly te doen door te kijken of het item uit A verandert tijdens elke iteratie.
Gewijzigd op 01/05/2017 13:20:33 door Thomas van den Heuvel
Ik heb het inmiddels met GOTO aan het werken, maar het voelt zo verkeerd...
(Het is ook wel geinig als je uitleg van PHP.net er bij naast legt is het precies mijn situatie. Toen ik het vorige week heb opgezet dacht ik Wow, lekker mooi zo kan ik het oplossen, totdat ik zag dat voor het laatste main regel de sub regel er van ontbrak....)
Precies, en dat los je op met joins, en niet in je code.
Gewijzigd op 01/05/2017 23:21:32 door Aad B
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
$sqlMain = "SELECT ISNULL(vra.SEKLVL3 COLLATE SQL_Latin1_General_CP1_CI_AS, 'LEEG') as SEKLVL3
,ISNULL(vra.NORMVALUE COLLATE SQL_Latin1_General_CP1_CI_AS, 'LEEG') as NORMVALUE
,sum(vra.WAARDE + vra.WAARDE2) as VALUE
FROM dmn.view_xxxx vra
WHERE vra.JAAR = ".$year."
AND vra.MAAND = ".$month."
GROUP BY vra.SEKLVL3 COLLATE SQL_Latin1_General_CP1_CI_AS
,vra.NORMVALUE COLLATE SQL_Latin1_General_CP1_CI_AS
ORDER BY (CASE WHEN vra.SEKLVL3 COLLATE SQL_Latin1_General_CP1_CI_AS IS NULL THEN 1 ELSE 0 END),
vra.SEKLVL3 COLLATE SQL_Latin1_General_CP1_CI_AS;";
$getResultMain = odbc_exec($con, $sqlMain );
while($row = odbc_fetch_array($getResultMain)) {
$keySekLvl3 = odbc_result($getResultMain, 'SEKLVL3');
if (($keyPreviousSectorLvl3 !== $keySekLvl3) && ($keyPreviousSectorLvl3 !== '')) {
// Het beruchte Goto label
Label_CheckSubrows:
$sqlSUB = "SELECT ISNULL(vra.SEKLVL4 COLLATE SQL_Latin1_General_CP1_CI_AS, 'LEEG') as SEKLVL4
,ISNULL(vra.NORMVALUE COLLATE SQL_Latin1_General_CP1_CI_AS, 'LEEG') as NORMVALUE
,sum(vra.WAARDE + vra.WAARDE2) as VALUE
FROM dmn.view_xxxx vra
WHERE vra.SEKLVL3 = '".$keySekLvl3."'
AND vra.JAAR = ".$year."
AND vra.MAAND = ".$month."
GROUP BY vra.SEKLVL4 COLLATE SQL_Latin1_General_CP1_CI_AS
,vra.NORMVALUE COLLATE SQL_Latin1_General_CP1_CI_AS
ORDER BY (CASE WHEN vra.SEKLVL4 COLLATE SQL_Latin1_General_CP1_CI_AS IS NULL THEN 1 ELSE 0 END),
vra.SEKLVL4 COLLATE SQL_Latin1_General_CP1_CI_AS;";
$getResultSub = odbc_exec($con, $sqlSUB);
while($row = odbc_fetch_array($getResultSub)) {
if ($keySubRowSeKLvl4 !== odbc_result($getResultSub, 'SEKLVL4')) {
$keySubRowSeKLvl4 = odbc_result($getResultSub, 'SEKLVL4');
}
}
// Hier verder met de (volgende) main record --> welke een kolom moet zijn
if (laatste main record)
goto Label_CheckSubrows; // voeg nog de laatste subregels toe aan de presentatie
}
}
?>
$sqlMain = "SELECT ISNULL(vra.SEKLVL3 COLLATE SQL_Latin1_General_CP1_CI_AS, 'LEEG') as SEKLVL3
,ISNULL(vra.NORMVALUE COLLATE SQL_Latin1_General_CP1_CI_AS, 'LEEG') as NORMVALUE
,sum(vra.WAARDE + vra.WAARDE2) as VALUE
FROM dmn.view_xxxx vra
WHERE vra.JAAR = ".$year."
AND vra.MAAND = ".$month."
GROUP BY vra.SEKLVL3 COLLATE SQL_Latin1_General_CP1_CI_AS
,vra.NORMVALUE COLLATE SQL_Latin1_General_CP1_CI_AS
ORDER BY (CASE WHEN vra.SEKLVL3 COLLATE SQL_Latin1_General_CP1_CI_AS IS NULL THEN 1 ELSE 0 END),
vra.SEKLVL3 COLLATE SQL_Latin1_General_CP1_CI_AS;";
$getResultMain = odbc_exec($con, $sqlMain );
while($row = odbc_fetch_array($getResultMain)) {
$keySekLvl3 = odbc_result($getResultMain, 'SEKLVL3');
if (($keyPreviousSectorLvl3 !== $keySekLvl3) && ($keyPreviousSectorLvl3 !== '')) {
// Het beruchte Goto label
Label_CheckSubrows:
$sqlSUB = "SELECT ISNULL(vra.SEKLVL4 COLLATE SQL_Latin1_General_CP1_CI_AS, 'LEEG') as SEKLVL4
,ISNULL(vra.NORMVALUE COLLATE SQL_Latin1_General_CP1_CI_AS, 'LEEG') as NORMVALUE
,sum(vra.WAARDE + vra.WAARDE2) as VALUE
FROM dmn.view_xxxx vra
WHERE vra.SEKLVL3 = '".$keySekLvl3."'
AND vra.JAAR = ".$year."
AND vra.MAAND = ".$month."
GROUP BY vra.SEKLVL4 COLLATE SQL_Latin1_General_CP1_CI_AS
,vra.NORMVALUE COLLATE SQL_Latin1_General_CP1_CI_AS
ORDER BY (CASE WHEN vra.SEKLVL4 COLLATE SQL_Latin1_General_CP1_CI_AS IS NULL THEN 1 ELSE 0 END),
vra.SEKLVL4 COLLATE SQL_Latin1_General_CP1_CI_AS;";
$getResultSub = odbc_exec($con, $sqlSUB);
while($row = odbc_fetch_array($getResultSub)) {
if ($keySubRowSeKLvl4 !== odbc_result($getResultSub, 'SEKLVL4')) {
$keySubRowSeKLvl4 = odbc_result($getResultSub, 'SEKLVL4');
}
}
// Hier verder met de (volgende) main record --> welke een kolom moet zijn
if (laatste main record)
goto Label_CheckSubrows; // voeg nog de laatste subregels toe aan de presentatie
}
}
?>
Beide query's geven de sommatie terug die per kolom getoond moet vorden:
Key Sek value | NORMVALUE 1 | NORMVALUE 2 | NORMVALUE 3 | NORMVALUE n |
Sek Main Lvl x | MainRecord1 value[/td | MainRecord2 value | MainRecord3 value | ManRecordn value |
- Sek Sub Lvl x1 | SubRecord1 value | SubRecord2 value | - | SubRecordn value |
- Sek Sub Lvl x2 | SubRecordn+1 value | - | SubRecordn+2 value | - |
Sek Main Lvl y | MainRecordn+1 value | - | - | MainRecordn+2 value |
- Sek Sub Lvl y1 | SubRecord1 value | SubRecord2 value | - | - |
Gewijzigd op 03/05/2017 23:52:14 door nkamp Kamp van de