Loop vast in Union statement
Ik schaar mezelf nog steeds onder beginners hoewel eea wel duidelijker gaat worden. Nu wil ik vervolgstap zien te maken maar ik staar me blind om gevens uit twee tabellen met elkaar te vergelijken.
De stituatie is:
Er bestaat een administratie waarin personen rbac geautoriseerd worden volgens het principe Medewerker->Rol->Activiteit-Autorisatie. Dit noemen we de Soll. Daarnaast bestaat er applicatie waarbinnen gebruikers worden geautoriseerd voor bepaalde rechten. Dit noemen we de Ist.
De praktijk is:
Personen stromen in, door en weer uit. Mensen zijn dus in beweging en daardoor veranderd ook de behoefte aan autorisaties.
De wens is:
Periodiek een controle uitvoeren over users met hun rechten (ist) nog steeds overeenkomen met de administratie (soll). Daarvoor importeer ik mbv 3-tal ist-bestanden (autorisatie, user2autorisatie en users) in eigen tabellen.
Maar vanaf dit punt wordt het lastiger... deze bestanden moeten met elkaar vergeleken worden en daar waar verschillen onstaan moet dit zichbaar gaan worden. Wanneer iemand volgens de administratie een autorisatie heeft maar in werkelijkheid niet op het systeem hebben we te maken met een soll-verschil. Heeft iemand een autorisatie binnen de applicatie wel maar niet via de administratie dan hebben we een ist-verschil (mogelijk risico?).
Nu dacht ik de UNION of UNION ALL statement te gebruiken. Zie hieronder. Ik heb een tool FlySpeed SQL Query gebruikt maar die zet all gegevens onder elkaar terwijl voor het gemak de Soll (S) en Ist (I) juist naast elkaar worden getoond en zodoende eenvoudig gegroepeerd overzicht krijg..
De code die ik in elkaar heb geflanst is:
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
50
51
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
50
51
global $connection;
$where = NULL;
if (isset($_GET['doelsysteem'])){
$where = 'WHERE MSKEYVALUE_DOELSYSTEEM = "'.mysqli_real_escape_string($connection, $_GET['doelsysteem']).'"';
}
$sqlUitlezen = mysqli_query($connection, "Select
bigpicture.idm_autorisatie.MSKEYVALUE_DOELSYSTEEM,
bigpicture.idm_ou.MSKEYVALUE_OU As S_OU,
bigpicture.idm_ou.Z_ORG_DN As S_organisatie,
Count(bigpicture.idm_autorisatie.MSKEYVALUE_AUTORISATIE) As soll
From
bigpicture.idm_autorisatie
Left Join bigpicture.idm_act2aut On bigpicture.idm_act2aut.MSKEYVALUE_AUTORISATIE = bigpicture.idm_autorisatie.MSKEYVALUE_AUTORISATIE
Left Join bigpicture.idm_activiteit On bigpicture.idm_activiteit.MSKEYVALUE_ACTIVITEIT = bigpicture.idm_act2aut.MSKEYVALUE_ACTIVITEIT
Left Join bigpicture.idm_role2act On bigpicture.idm_role2act.MSKEYVALUE_ACTIVITEIT = bigpicture.idm_activiteit.MSKEYVALUE_ACTIVITEIT
Left Join bigpicture.idm_role On bigpicture.idm_role.MSKEYVALUE_ROL = bigpicture.idm_role2act.MSKEYVALUE_ROL
Left Join bigpicture.idm_person2role On bigpicture.idm_person2role.MSKEYVALUE_ROL = bigpicture.idm_role.MSKEYVALUE_ROL
Left Join bigpicture.idm_person On bigpicture.idm_person.MSKEYVALUE_MEDEWERKER = bigpicture.idm_person2role.MSKEYVALUE_MEDEWERKER
Left Join bigpicture.idm_ou On bigpicture.idm_ou.MSKEYVALUE_OU = bigpicture.idm_person.ACHMEA_REF_OU
".$where."
Group By
bigpicture.idm_autorisatie.MSKEYVALUE_DOELSYSTEEM,
bigpicture.idm_ou.MSKEYVALUE_OU,
bigpicture.idm_ou.Z_ORG_DN
Union All
Select
bigpicture.ist_aut_swift_productie_cea.Systeem,
bigpicture.idm_ou.MSKEYVALUE_OU As I_OU,
bigpicture.idm_ou.Z_ORG_DN As I_organisatie,
Count(bigpicture.ist_aut_swift_productie_cea.Autorisatienaam) As ist
From
bigpicture.ist_aut_swift_productie_cea
Left Join bigpicture.ist_user2aut_swift_productie_cea On bigpicture.ist_user2aut_swift_productie_cea.Autorisatie_naam = bigpicture.ist_aut_swift_productie_cea.Autorisatienaam
Left Join bigpicture.ist_user_swift_productie_cea On bigpicture.ist_user_swift_productie_cea.gebruikersnaam = bigpicture.ist_user2aut_swift_productie_cea.gebruikersnaam
Left Join bigpicture.idm_person On bigpicture.idm_person.ACHMEA_EMPLOYEENUMBER = bigpicture.ist_user_swift_productie_cea.Personeelsnummer
Left Join bigpicture.idm_ou On bigpicture.idm_ou.MSKEYVALUE_OU = bigpicture.idm_person.ACHMEA_REF_OU
Group By
bigpicture.ist_aut_swift_productie_cea.Systeem,
bigpicture.idm_ou.MSKEYVALUE_OU,
bigpicture.idm_ou.Z_ORG_DN
Order By
MSKEYVALUE_DOELSYSTEEM Desc,
S_OU
");
$where = NULL;
if (isset($_GET['doelsysteem'])){
$where = 'WHERE MSKEYVALUE_DOELSYSTEEM = "'.mysqli_real_escape_string($connection, $_GET['doelsysteem']).'"';
}
$sqlUitlezen = mysqli_query($connection, "Select
bigpicture.idm_autorisatie.MSKEYVALUE_DOELSYSTEEM,
bigpicture.idm_ou.MSKEYVALUE_OU As S_OU,
bigpicture.idm_ou.Z_ORG_DN As S_organisatie,
Count(bigpicture.idm_autorisatie.MSKEYVALUE_AUTORISATIE) As soll
From
bigpicture.idm_autorisatie
Left Join bigpicture.idm_act2aut On bigpicture.idm_act2aut.MSKEYVALUE_AUTORISATIE = bigpicture.idm_autorisatie.MSKEYVALUE_AUTORISATIE
Left Join bigpicture.idm_activiteit On bigpicture.idm_activiteit.MSKEYVALUE_ACTIVITEIT = bigpicture.idm_act2aut.MSKEYVALUE_ACTIVITEIT
Left Join bigpicture.idm_role2act On bigpicture.idm_role2act.MSKEYVALUE_ACTIVITEIT = bigpicture.idm_activiteit.MSKEYVALUE_ACTIVITEIT
Left Join bigpicture.idm_role On bigpicture.idm_role.MSKEYVALUE_ROL = bigpicture.idm_role2act.MSKEYVALUE_ROL
Left Join bigpicture.idm_person2role On bigpicture.idm_person2role.MSKEYVALUE_ROL = bigpicture.idm_role.MSKEYVALUE_ROL
Left Join bigpicture.idm_person On bigpicture.idm_person.MSKEYVALUE_MEDEWERKER = bigpicture.idm_person2role.MSKEYVALUE_MEDEWERKER
Left Join bigpicture.idm_ou On bigpicture.idm_ou.MSKEYVALUE_OU = bigpicture.idm_person.ACHMEA_REF_OU
".$where."
Group By
bigpicture.idm_autorisatie.MSKEYVALUE_DOELSYSTEEM,
bigpicture.idm_ou.MSKEYVALUE_OU,
bigpicture.idm_ou.Z_ORG_DN
Union All
Select
bigpicture.ist_aut_swift_productie_cea.Systeem,
bigpicture.idm_ou.MSKEYVALUE_OU As I_OU,
bigpicture.idm_ou.Z_ORG_DN As I_organisatie,
Count(bigpicture.ist_aut_swift_productie_cea.Autorisatienaam) As ist
From
bigpicture.ist_aut_swift_productie_cea
Left Join bigpicture.ist_user2aut_swift_productie_cea On bigpicture.ist_user2aut_swift_productie_cea.Autorisatie_naam = bigpicture.ist_aut_swift_productie_cea.Autorisatienaam
Left Join bigpicture.ist_user_swift_productie_cea On bigpicture.ist_user_swift_productie_cea.gebruikersnaam = bigpicture.ist_user2aut_swift_productie_cea.gebruikersnaam
Left Join bigpicture.idm_person On bigpicture.idm_person.ACHMEA_EMPLOYEENUMBER = bigpicture.ist_user_swift_productie_cea.Personeelsnummer
Left Join bigpicture.idm_ou On bigpicture.idm_ou.MSKEYVALUE_OU = bigpicture.idm_person.ACHMEA_REF_OU
Group By
bigpicture.ist_aut_swift_productie_cea.Systeem,
bigpicture.idm_ou.MSKEYVALUE_OU,
bigpicture.idm_ou.Z_ORG_DN
Order By
MSKEYVALUE_DOELSYSTEEM Desc,
S_OU
");
maar helaas is niet erg bruikbaar op deze manier.. iemand een idee? of kan me in een goede richten manoevreren?
Heel beniewd en ik waaardeer nu al jullie tomeloze inzet en voor het meedenken..
Toevoeging op 29/11/2020 16:40:22:
Een andere methode is dat ik heb geprobeerd om 2 select statements apart te definieren. Helaas geeft dat ook niet gewenste restultaat... ik draai maar rondjes en weet niet goed hoe ik dit nu moet aanpakken.
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<?php
//------------------------------------------------------------------------ FUNCTIE Soll/Ist vergelijking op systeemniveau
function soll_ist_systeem_swift_productie_cea(){
global $connection;
$where = NULL;
if (isset($_GET['doelsysteem'])){
$where = 'WHERE MSKEYVALUE_DOELSYSTEEM = "'.mysqli_real_escape_string($connection, $_GET['doelsysteem']).'"';
}
$sqlUitlezenSoll = mysqli_query($connection, "Select
bigpicture.idm_autorisatie.MSKEYVALUE_DOELSYSTEEM,
bigpicture.idm_ou.MSKEYVALUE_OU As S_OU,
bigpicture.idm_ou.Z_ORG_DN As S_organisatie,
Count(bigpicture.idm_autorisatie.MSKEYVALUE_AUTORISATIE) As soll
From
bigpicture.idm_autorisatie
Left Join bigpicture.idm_act2aut On bigpicture.idm_act2aut.MSKEYVALUE_AUTORISATIE = bigpicture.idm_autorisatie.MSKEYVALUE_AUTORISATIE
Left Join bigpicture.idm_activiteit On bigpicture.idm_activiteit.MSKEYVALUE_ACTIVITEIT = bigpicture.idm_act2aut.MSKEYVALUE_ACTIVITEIT
Left Join bigpicture.idm_role2act On bigpicture.idm_role2act.MSKEYVALUE_ACTIVITEIT = bigpicture.idm_activiteit.MSKEYVALUE_ACTIVITEIT
Left Join bigpicture.idm_role On bigpicture.idm_role.MSKEYVALUE_ROL = bigpicture.idm_role2act.MSKEYVALUE_ROL
Left Join bigpicture.idm_person2role On bigpicture.idm_person2role.MSKEYVALUE_ROL = bigpicture.idm_role.MSKEYVALUE_ROL
Left Join bigpicture.idm_person On bigpicture.idm_person.MSKEYVALUE_MEDEWERKER = bigpicture.idm_person2role.MSKEYVALUE_MEDEWERKER
Left Join bigpicture.idm_ou On bigpicture.idm_ou.MSKEYVALUE_OU = bigpicture.idm_person.ACHMEA_REF_OU
".$where."
Group By
bigpicture.idm_autorisatie.MSKEYVALUE_DOELSYSTEEM,
bigpicture.idm_ou.MSKEYVALUE_OU,
bigpicture.idm_ou.Z_ORG_DN
Order By
bigpicture.idm_autorisatie.MSKEYVALUE_DOELSYSTEEM Desc,
S_OU
");
$sqlUitlezenIst = mysqli_query($connection, "Select
bigpicture.ist_aut_swift_productie_cea.Systeem,
bigpicture.idm_ou.MSKEYVALUE_OU As I_OU,
bigpicture.idm_ou.Z_ORG_DN As I_organisatie,
Count(bigpicture.ist_aut_swift_productie_cea.Autorisatienaam) As ist
From
bigpicture.ist_aut_swift_productie_cea
Left Join bigpicture.ist_user2aut_swift_productie_cea On bigpicture.ist_user2aut_swift_productie_cea.Autorisatie_naam = bigpicture.ist_aut_swift_productie_cea.Autorisatienaam
Left Join bigpicture.ist_user_swift_productie_cea On bigpicture.ist_user_swift_productie_cea.gebruikersnaam = bigpicture.ist_user2aut_swift_productie_cea.gebruikersnaam
Left Join bigpicture.idm_person On bigpicture.idm_person.ACHMEA_EMPLOYEENUMBER = bigpicture.ist_user_swift_productie_cea.Personeelsnummer
Left Join bigpicture.idm_ou On bigpicture.idm_ou.MSKEYVALUE_OU = bigpicture.idm_person.ACHMEA_REF_OU
Group By
bigpicture.ist_aut_swift_productie_cea.Systeem,
bigpicture.idm_ou.MSKEYVALUE_OU,
bigpicture.idm_ou.Z_ORG_DN
");
$sqlAantalSoll = mysqli_num_rows($sqlUitlezenSoll);
echo '<table id="idmdata">';
echo '<tr>';
echo '<th colspan="5">Audit: Soll/IST systeemrapport voor '.strtoupper($_GET['doelsysteem']).'</th>';
echo '</tr>';
echo '<tr>';
echo '<th>Soll</th>';
echo '<th>Ist</th>';
echo '<th align="center">S</th>';
echo '</tr>';
echo '<tr>';
echo '<th><font size="-1">OU code</th>';
echo '<th><font size="-1">Afdeling</th>';
echo '<th><font size="-1"></th>';
echo '</tr>';
if ($sqlAantalSoll > 0){
while ($sqlDataSoll = mysqli_fetch_assoc($sqlUitlezenSoll)){
echo '<tr>';
echo '<td><font size="-2">'.$sqlDataSoll['S_OU'].'</td>';
echo '<td><font size="-2">'.$sqlDataSoll['S_organisatie'].'</td>';
echo '<td><font size="-2">'.$sqlDataSoll['soll'].'</td>';
echo '</tr>';
}
echo '</table>';
echo '<br />';
echo '<button class="button1" style="vertical-align:middle"><span><div id="button"><a href="javascript:javascript:history.go(-1)"> Vorige pagina</a></div></span></button>';
}
$sqlAantalIst = mysqli_num_rows($sqlUitlezenIst);
echo '<table id="idmdata">';
echo '<tr>';
echo '<th colspan="5">Audit: Soll/IST systeemrapport voor '.strtoupper($_GET['doelsysteem']).'</th>';
echo '</tr>';
echo '<tr>';
echo '<th>Soll</th>';
echo '<th>Ist</th>';
echo '<th align="center">I</th>';
echo '</tr>';
echo '<tr>';
echo '<th><font size="-1">OU code</th>';
echo '<th><font size="-1">Afdeling</th>';
echo '<th><font size="-1"></th>';
echo '</tr>';
if ($sqlAantalIst > 0){
while ($sqlDataIst = mysqli_fetch_assoc($sqlUitlezenIst)){
echo '<tr>';
echo '<td><font size="-2">'.$sqlDataIst['I_OU'].'</td>';
echo '<td><font size="-2">'.$sqlDataIst['I_organisatie'].'</td>';
echo '<td><font size="-2">'.$sqlDataIst['ist'].'</td>';
echo '</tr>';
}
echo '</table>';
echo '<br />';
echo '<button class="button1" style="vertical-align:middle"><span><div id="button"><a href="javascript:javascript:history.go(-1)"> Vorige pagina</a></div></span></button>';
}
else{
echo '<center><a href="javascript:javascript:history.go(-1)"><img src="../img/no-data.png"></a></center>';
}
}
?>
//------------------------------------------------------------------------ FUNCTIE Soll/Ist vergelijking op systeemniveau
function soll_ist_systeem_swift_productie_cea(){
global $connection;
$where = NULL;
if (isset($_GET['doelsysteem'])){
$where = 'WHERE MSKEYVALUE_DOELSYSTEEM = "'.mysqli_real_escape_string($connection, $_GET['doelsysteem']).'"';
}
$sqlUitlezenSoll = mysqli_query($connection, "Select
bigpicture.idm_autorisatie.MSKEYVALUE_DOELSYSTEEM,
bigpicture.idm_ou.MSKEYVALUE_OU As S_OU,
bigpicture.idm_ou.Z_ORG_DN As S_organisatie,
Count(bigpicture.idm_autorisatie.MSKEYVALUE_AUTORISATIE) As soll
From
bigpicture.idm_autorisatie
Left Join bigpicture.idm_act2aut On bigpicture.idm_act2aut.MSKEYVALUE_AUTORISATIE = bigpicture.idm_autorisatie.MSKEYVALUE_AUTORISATIE
Left Join bigpicture.idm_activiteit On bigpicture.idm_activiteit.MSKEYVALUE_ACTIVITEIT = bigpicture.idm_act2aut.MSKEYVALUE_ACTIVITEIT
Left Join bigpicture.idm_role2act On bigpicture.idm_role2act.MSKEYVALUE_ACTIVITEIT = bigpicture.idm_activiteit.MSKEYVALUE_ACTIVITEIT
Left Join bigpicture.idm_role On bigpicture.idm_role.MSKEYVALUE_ROL = bigpicture.idm_role2act.MSKEYVALUE_ROL
Left Join bigpicture.idm_person2role On bigpicture.idm_person2role.MSKEYVALUE_ROL = bigpicture.idm_role.MSKEYVALUE_ROL
Left Join bigpicture.idm_person On bigpicture.idm_person.MSKEYVALUE_MEDEWERKER = bigpicture.idm_person2role.MSKEYVALUE_MEDEWERKER
Left Join bigpicture.idm_ou On bigpicture.idm_ou.MSKEYVALUE_OU = bigpicture.idm_person.ACHMEA_REF_OU
".$where."
Group By
bigpicture.idm_autorisatie.MSKEYVALUE_DOELSYSTEEM,
bigpicture.idm_ou.MSKEYVALUE_OU,
bigpicture.idm_ou.Z_ORG_DN
Order By
bigpicture.idm_autorisatie.MSKEYVALUE_DOELSYSTEEM Desc,
S_OU
");
$sqlUitlezenIst = mysqli_query($connection, "Select
bigpicture.ist_aut_swift_productie_cea.Systeem,
bigpicture.idm_ou.MSKEYVALUE_OU As I_OU,
bigpicture.idm_ou.Z_ORG_DN As I_organisatie,
Count(bigpicture.ist_aut_swift_productie_cea.Autorisatienaam) As ist
From
bigpicture.ist_aut_swift_productie_cea
Left Join bigpicture.ist_user2aut_swift_productie_cea On bigpicture.ist_user2aut_swift_productie_cea.Autorisatie_naam = bigpicture.ist_aut_swift_productie_cea.Autorisatienaam
Left Join bigpicture.ist_user_swift_productie_cea On bigpicture.ist_user_swift_productie_cea.gebruikersnaam = bigpicture.ist_user2aut_swift_productie_cea.gebruikersnaam
Left Join bigpicture.idm_person On bigpicture.idm_person.ACHMEA_EMPLOYEENUMBER = bigpicture.ist_user_swift_productie_cea.Personeelsnummer
Left Join bigpicture.idm_ou On bigpicture.idm_ou.MSKEYVALUE_OU = bigpicture.idm_person.ACHMEA_REF_OU
Group By
bigpicture.ist_aut_swift_productie_cea.Systeem,
bigpicture.idm_ou.MSKEYVALUE_OU,
bigpicture.idm_ou.Z_ORG_DN
");
$sqlAantalSoll = mysqli_num_rows($sqlUitlezenSoll);
echo '<table id="idmdata">';
echo '<tr>';
echo '<th colspan="5">Audit: Soll/IST systeemrapport voor '.strtoupper($_GET['doelsysteem']).'</th>';
echo '</tr>';
echo '<tr>';
echo '<th>Soll</th>';
echo '<th>Ist</th>';
echo '<th align="center">S</th>';
echo '</tr>';
echo '<tr>';
echo '<th><font size="-1">OU code</th>';
echo '<th><font size="-1">Afdeling</th>';
echo '<th><font size="-1"></th>';
echo '</tr>';
if ($sqlAantalSoll > 0){
while ($sqlDataSoll = mysqli_fetch_assoc($sqlUitlezenSoll)){
echo '<tr>';
echo '<td><font size="-2">'.$sqlDataSoll['S_OU'].'</td>';
echo '<td><font size="-2">'.$sqlDataSoll['S_organisatie'].'</td>';
echo '<td><font size="-2">'.$sqlDataSoll['soll'].'</td>';
echo '</tr>';
}
echo '</table>';
echo '<br />';
echo '<button class="button1" style="vertical-align:middle"><span><div id="button"><a href="javascript:javascript:history.go(-1)"> Vorige pagina</a></div></span></button>';
}
$sqlAantalIst = mysqli_num_rows($sqlUitlezenIst);
echo '<table id="idmdata">';
echo '<tr>';
echo '<th colspan="5">Audit: Soll/IST systeemrapport voor '.strtoupper($_GET['doelsysteem']).'</th>';
echo '</tr>';
echo '<tr>';
echo '<th>Soll</th>';
echo '<th>Ist</th>';
echo '<th align="center">I</th>';
echo '</tr>';
echo '<tr>';
echo '<th><font size="-1">OU code</th>';
echo '<th><font size="-1">Afdeling</th>';
echo '<th><font size="-1"></th>';
echo '</tr>';
if ($sqlAantalIst > 0){
while ($sqlDataIst = mysqli_fetch_assoc($sqlUitlezenIst)){
echo '<tr>';
echo '<td><font size="-2">'.$sqlDataIst['I_OU'].'</td>';
echo '<td><font size="-2">'.$sqlDataIst['I_organisatie'].'</td>';
echo '<td><font size="-2">'.$sqlDataIst['ist'].'</td>';
echo '</tr>';
}
echo '</table>';
echo '<br />';
echo '<button class="button1" style="vertical-align:middle"><span><div id="button"><a href="javascript:javascript:history.go(-1)"> Vorige pagina</a></div></span></button>';
}
else{
echo '<center><a href="javascript:javascript:history.go(-1)"><img src="../img/no-data.png"></a></center>';
}
}
?>
Voor ik verder iets zeg, wil ik je eerst wijzen op een foutje in je tweede stuk code: op regel 82 en 113 staat de </table> binnen het if-statement. Dat houdt in dat als de query geen resultaten oplevert, de tabel niet wordt afgesloten. De </table> zou dus buiten het if-blok geplaatst moeten worden (of de openingstag en de header-regels moeten ook binnen het if-statement; net wat voor jou logischer is).
Ook hebben beide tabellen hetzelfde id ("idmdata"). Dat mag niet; een id moet uniek zijn op je pagina.
Er zijn verschillende manieren om de tabellen naast elkaar te krijgen. Ik zal hieronder twee van die manieren schetsen, zodat je iets hebt om mee te spelen. Ongetwijfeld zullen er meer oplossingen te bedenken zijn.
1: tabel met tabellen
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<table>
<tr>
<td>
[plaats hier je soll-tabel]
</td>
<td>
[plaats hier je ist-tabel]
</td>
</tr>
</table>
<tr>
<td>
[plaats hier je soll-tabel]
</td>
<td>
[plaats hier je ist-tabel]
</td>
</tr>
</table>
2: elke tabel in een div en die divs naast elkaar plaatsen
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<div id="wrapper">
<div style="display:inline-block;">
[plaats hier je soll-tabel]
</div>
<div style="display:inline-block;">
[plaats hier je ist-tabel]
</div>
</div>
<div style="display:inline-block;">
[plaats hier je soll-tabel]
</div>
<div style="display:inline-block;">
[plaats hier je ist-tabel]
</div>
</div>
Mijn eigen voorkeur gaat uit naar de tweede manier. De eerste, met geneste tabellen, is meer iets van tien jaar geleden en zou misschien zelfs voor een wat tragere opmaak van je pagina kunnen zorgen.
Voor PostgreSQL, zie https://www.postgresqltutorial.com/postgresql-full-outer-join
MySQL en MariaDB ondersteunen geen FULL OUTER JOIN. Je kunt met een omweg zo'n JOIN wel 'nadoen' met een UNION.
Voorbeeld: https://stackoverflow.com/questions/4796872/how-to-do-a-full-outer-join-in-mysql
Merk op dat je de twee GROUP BY in een UNION wilt verplaatsen buiten de UNION, dus met de UNION in een subquery waarvan je GROUP BY doet op het resultaat van de UNION.
Voorbeeld: https://stackoverflow.com/questions/8572821/group-by-with-union-mysql-select-query
Wanneer de resultaten eenmaal uit de database komen zoals je ze op het scherm wilt hebben, is de vertaalslag van een SQL resultaat naar HTML een stuk simpeler voor, en sneller in PHP.
EDIT: de UNION ALL die je in jouw code hebt, ontdubbelt juist geen rijen maar laat ze allemaal door.
Dank je voor dit inzicht en de verbetering. Helemaal top. Eigenlijk is dit voorstel best eenvoudig en die zou ik ook zeker bedacht kunnen hebben wanneer er twee platte lijsten getoond moest tonen. Maar wat ik graag willen, en dat heb ik misschien dan niet goed naar voren laten komen in mijn eerdere bericht is dat de rechterlijst (Ist) vergeleken kan worden met de linkerlijst (soll) en andersom en dan bij verschillen (links of rechts) dit met een kleurtje wordt aangegeven bijv.. Hieronder heb ik de php-functie die ik nu heb in zijn totaliteit geplaats met jouw 2e optie. Dat geeft een prima weergave van de twee tabellen naast elkaar. Maar hoe dan hierbij met het if-statment gewerkt kan worden in de twee verschillende while loops weet ik voorsalnog niet te doorbreken. Misschien dat de optie van Ad Fundum daar uitkomst in bied. Daar ga ik zeker ook nog naar kijken maar daar heb ik meer tijd voor nodig om dat proberen te doorgronden. Maar we blijven stug doorproberen horen hoewel het een puzzelstuk blijf.
Hieronder dan nog de complete code wat als resultaat de twee tabellen naast elkaar op scherm te projecteren:
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php
//------------------------------------------------------------------------ FUNCTIE Soll/Ist vergelijking op systeemniveau
function soll_ist_systeem_swift_productie_cea(){
global $connection;
//--------------------------------------------------------------------------------------------------------------------------------------------------------------- SOLL
$whereSoll = NULL;
if (isset($_GET['doelsysteem'])){
$whereSoll = 'WHERE idm_doelsysteem.MSKEYVALUE_DOELSYSTEEM = "'.mysqli_real_escape_string($connection, $_GET['doelsysteem']).'"';
}
$sqlUitlezenSoll = mysqli_query($connection, "Select
bigpicture.idm_person.REF_OU AS S_OU,
Count(bigpicture.idm_autorisatie.MSKEYVALUE_AUTORISATIE) As Soll
From
bigpicture.idm_doelsysteem
Inner Join idm_autorisatie On idm_autorisatie.MSKEYVALUE_DOELSYSTEEM = idm_doelsysteem.MSKEYVALUE_DOELSYSTEEM
Inner Join idm_act2aut On idm_act2aut.MSKEYVALUE_AUTORISATIE = idm_autorisatie.MSKEYVALUE_AUTORISATIE
Inner Join idm_role2act On idm_role2act.MSKEYVALUE_ACTIVITEIT = idm_act2aut.MSKEYVALUE_ACTIVITEIT
Inner Join idm_person2role On idm_person2role.MSKEYVALUE_ROL = idm_role2act.MSKEYVALUE_ROL
Inner Join idm_person On idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
".$whereSoll."
Group By
idm_doelsysteem.MSKEYVALUE_DOELSYSTEEM,
idm_person.REF_OU
");
//--------------------------------------------------------------------------------------------------------------------------------------------------------------- IST
$whereIst = NULL;
if (isset($_GET['doelsysteem'])){
$whereIst = 'WHERE idm_doelsysteem.MSKEYVALUE_DOELSYSTEEM = "'.mysqli_real_escape_string($connection, $_GET['doelsysteem']).'"';
}
$sqlUitlezenIst = mysqli_query($connection, "Select
idm_person.REF_OU AS I_OU,
Count(ist_user2aut_swift_productie_cea.Autorisatie_naam) As Ist
From
ist_user2aut_swift_productie_cea
Inner Join idm_person On idm_person.ACCOUNTNAME = ist_user2aut_swift_productie_cea.gebruikersnaam
Group By
idm_person.REF_OU
");
//---------------------------------------------------------------------------------------------------------------------------------------------------------------
echo'<div id="wrapper">';
echo'<div style="display:inline-block;">';
$sqlAantalSoll = mysqli_num_rows($sqlUitlezenSoll);
echo '<table id="idmdata" width="48%">';
echo '<th><font size="-1">Soll</th>';
echo '<th><font size="-1">#</th>';
echo '</tr>';
if ($sqlAantalSoll > 0){
while ($sqlDataSoll = mysqli_fetch_assoc($sqlUitlezenSoll)){
echo '<tr>';
echo '<td><font size="-2">'.$sqlDataSoll['S_OU'].' </td>';
echo '<td><font size="-2">'.$sqlDataSoll['Soll'].' </td>';
echo '</tr>';
}
}else{
echo '<center>GEEN SOLL GEGEVENS GEVONDEN!</center>';
}
echo '</table>';
echo'</div>';
echo'<div style="display:inline-block;">';
$sqlAantalIst = mysqli_num_rows($sqlUitlezenIst);
echo '<table id="idmdata" width="48%">';
echo '<th align="right"><font size="-1">Ist</th>';
echo '<th><font size="-1">#</th>';
echo '</tr>';
if ($sqlAantalIst > 0){
while ($sqlDataIst = mysqli_fetch_assoc($sqlUitlezenIst)){
echo '<tr>';
echo '<td><font size="-2">'.$sqlDataIst['I_OU'].' </td>';
echo '<td><font size="-2">'.$sqlDataIst['Ist'].' </td>';
echo '</tr>';
}
}else{
echo '<center>GEEN IST GEGEVENS GEVONDEN!</center>';
}
echo '</table>';
echo'</div>';
echo'</div>';
//---------------------------------------------------------------------------------------------------------------------------------------------------------------
echo '<button class="button1" style="vertical-align:middle"><span><div id="button"><a href="javascript:javascript:history.go(-1)"> Vorige pagina</a></div></span></button>';
}
?>
//------------------------------------------------------------------------ FUNCTIE Soll/Ist vergelijking op systeemniveau
function soll_ist_systeem_swift_productie_cea(){
global $connection;
//--------------------------------------------------------------------------------------------------------------------------------------------------------------- SOLL
$whereSoll = NULL;
if (isset($_GET['doelsysteem'])){
$whereSoll = 'WHERE idm_doelsysteem.MSKEYVALUE_DOELSYSTEEM = "'.mysqli_real_escape_string($connection, $_GET['doelsysteem']).'"';
}
$sqlUitlezenSoll = mysqli_query($connection, "Select
bigpicture.idm_person.REF_OU AS S_OU,
Count(bigpicture.idm_autorisatie.MSKEYVALUE_AUTORISATIE) As Soll
From
bigpicture.idm_doelsysteem
Inner Join idm_autorisatie On idm_autorisatie.MSKEYVALUE_DOELSYSTEEM = idm_doelsysteem.MSKEYVALUE_DOELSYSTEEM
Inner Join idm_act2aut On idm_act2aut.MSKEYVALUE_AUTORISATIE = idm_autorisatie.MSKEYVALUE_AUTORISATIE
Inner Join idm_role2act On idm_role2act.MSKEYVALUE_ACTIVITEIT = idm_act2aut.MSKEYVALUE_ACTIVITEIT
Inner Join idm_person2role On idm_person2role.MSKEYVALUE_ROL = idm_role2act.MSKEYVALUE_ROL
Inner Join idm_person On idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
".$whereSoll."
Group By
idm_doelsysteem.MSKEYVALUE_DOELSYSTEEM,
idm_person.REF_OU
");
//--------------------------------------------------------------------------------------------------------------------------------------------------------------- IST
$whereIst = NULL;
if (isset($_GET['doelsysteem'])){
$whereIst = 'WHERE idm_doelsysteem.MSKEYVALUE_DOELSYSTEEM = "'.mysqli_real_escape_string($connection, $_GET['doelsysteem']).'"';
}
$sqlUitlezenIst = mysqli_query($connection, "Select
idm_person.REF_OU AS I_OU,
Count(ist_user2aut_swift_productie_cea.Autorisatie_naam) As Ist
From
ist_user2aut_swift_productie_cea
Inner Join idm_person On idm_person.ACCOUNTNAME = ist_user2aut_swift_productie_cea.gebruikersnaam
Group By
idm_person.REF_OU
");
//---------------------------------------------------------------------------------------------------------------------------------------------------------------
echo'<div id="wrapper">';
echo'<div style="display:inline-block;">';
$sqlAantalSoll = mysqli_num_rows($sqlUitlezenSoll);
echo '<table id="idmdata" width="48%">';
echo '<th><font size="-1">Soll</th>';
echo '<th><font size="-1">#</th>';
echo '</tr>';
if ($sqlAantalSoll > 0){
while ($sqlDataSoll = mysqli_fetch_assoc($sqlUitlezenSoll)){
echo '<tr>';
echo '<td><font size="-2">'.$sqlDataSoll['S_OU'].' </td>';
echo '<td><font size="-2">'.$sqlDataSoll['Soll'].' </td>';
echo '</tr>';
}
}else{
echo '<center>GEEN SOLL GEGEVENS GEVONDEN!</center>';
}
echo '</table>';
echo'</div>';
echo'<div style="display:inline-block;">';
$sqlAantalIst = mysqli_num_rows($sqlUitlezenIst);
echo '<table id="idmdata" width="48%">';
echo '<th align="right"><font size="-1">Ist</th>';
echo '<th><font size="-1">#</th>';
echo '</tr>';
if ($sqlAantalIst > 0){
while ($sqlDataIst = mysqli_fetch_assoc($sqlUitlezenIst)){
echo '<tr>';
echo '<td><font size="-2">'.$sqlDataIst['I_OU'].' </td>';
echo '<td><font size="-2">'.$sqlDataIst['Ist'].' </td>';
echo '</tr>';
}
}else{
echo '<center>GEEN IST GEGEVENS GEVONDEN!</center>';
}
echo '</table>';
echo'</div>';
echo'</div>';
//---------------------------------------------------------------------------------------------------------------------------------------------------------------
echo '<button class="button1" style="vertical-align:middle"><span><div id="button"><a href="javascript:javascript:history.go(-1)"> Vorige pagina</a></div></span></button>';
}
?>
Gewijzigd op 03/12/2020 23:53:56 door - DHU -
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
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
SELECT
idm_ou.MSKEYVALUE_OU,
idm_ou.Z_ORG_DN,
COUNT(DISTINCT idm_person2role.MSKEYVALUE_MEDEWERKER) soll,
COUNT(DISTINCT ist_user_swift_productie_cea.Personeelsnummer) ist
FROM
idm_person p
INNER JOIN
idm_ou ON idm_ou.MSKEYVALUE_OU = idm_person.ACHMEA_REF_OU
LEFT JOIN
(idm_person2role
INNER JOIN
(SELECT
DISTINCT role2act.MSKEYVALUE_ROL
FROM
idm_autorisatie
INNER JOIN
idm_act2aut ON idm_act2aut.MSKEYVALUE_AUTORISATIE = idm_autorisatie.MSKEYVALUE_AUTORISATIE
INNER JOIN
idm_role2act ON idm_role2act.MSKEYVALUE_ACTIVITEIT =idm_act2aut.MSKEYVALUE_ACTIVITEIT
WHERE
idm_autorisatie.MSKEYVALUE_DOELSYSTEEM = 'waarde van $_GET'
) soll_t ON soll_t.MSKEYVALUE_ROL = idm_person2role.MSKEYVALUE_ROL
) ON idm_person2role.MSKEYVALUE_MEDEWERKER = idm_person.MSKEYVALUE_MEDEWERKER
LEFT JOIN
(ist_user_swift_productie_cea
INNER JOIN
(SELECT
DISTINCT ist_user2aut_swift_productie_cea.gebruikersnaam
FROM
ist_aut_swift_productie_cea
INNER JOIN
ist_user2aut_swift_productie_cea ON ist_user2aut_swift_productie_cea.Autorisatie_naam = ist_aut_swift_productie_cea.Autorisatienaam
) ist_t ON ist_t.gebruikersnaam = ist_user_swift_productie_cea.gebruikersnaam
) ON idm_person.ACHMEA_EMPLOYEENUMBER = ist_user_swift_productie_cea.Personeelsnummer
GROUP BY
idm_ou.MSKEYVALUE_OU,
idm_ou.Z_ORG_D
idm_ou.MSKEYVALUE_OU,
idm_ou.Z_ORG_DN,
COUNT(DISTINCT idm_person2role.MSKEYVALUE_MEDEWERKER) soll,
COUNT(DISTINCT ist_user_swift_productie_cea.Personeelsnummer) ist
FROM
idm_person p
INNER JOIN
idm_ou ON idm_ou.MSKEYVALUE_OU = idm_person.ACHMEA_REF_OU
LEFT JOIN
(idm_person2role
INNER JOIN
(SELECT
DISTINCT role2act.MSKEYVALUE_ROL
FROM
idm_autorisatie
INNER JOIN
idm_act2aut ON idm_act2aut.MSKEYVALUE_AUTORISATIE = idm_autorisatie.MSKEYVALUE_AUTORISATIE
INNER JOIN
idm_role2act ON idm_role2act.MSKEYVALUE_ACTIVITEIT =idm_act2aut.MSKEYVALUE_ACTIVITEIT
WHERE
idm_autorisatie.MSKEYVALUE_DOELSYSTEEM = 'waarde van $_GET'
) soll_t ON soll_t.MSKEYVALUE_ROL = idm_person2role.MSKEYVALUE_ROL
) ON idm_person2role.MSKEYVALUE_MEDEWERKER = idm_person.MSKEYVALUE_MEDEWERKER
LEFT JOIN
(ist_user_swift_productie_cea
INNER JOIN
(SELECT
DISTINCT ist_user2aut_swift_productie_cea.gebruikersnaam
FROM
ist_aut_swift_productie_cea
INNER JOIN
ist_user2aut_swift_productie_cea ON ist_user2aut_swift_productie_cea.Autorisatie_naam = ist_aut_swift_productie_cea.Autorisatienaam
) ist_t ON ist_t.gebruikersnaam = ist_user_swift_productie_cea.gebruikersnaam
) ON idm_person.ACHMEA_EMPLOYEENUMBER = ist_user_swift_productie_cea.Personeelsnummer
GROUP BY
idm_ou.MSKEYVALUE_OU,
idm_ou.Z_ORG_D
Dit telt het aantal personen dat een autorisatie heeft op soll en/of ist per afdeling
Gewijzigd op 04/12/2020 17:08:19 door Ger van Steenderen
deze code werkt niet resulteert niet in een resultaat.. komt geen melding en bij wat dingen uitproberen krijg ik afhankelijke wat ik aan het proberen ben foutmeldingen... ergens klopt er niet in... maar ga het proberen of ik het kan achterhalen waar het 'm in zit. Dit zal zeker niet voor komende zondag zijn...... Maar toch onwijs bedankt voor de reactie
Is dit niet beter leesbaar? Je ziet zo beter onderscheid tussen HTML en PHP, en je hoeft niet meer te escapen.
Verder zijn font-tags verouderd, en kan je de opmaak prima in CSS bewerkstelligen.
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<div style="display:inline-block;">';
<?php
$sqlAantalSoll = mysqli_num_rows($sqlUitlezenSoll);
?>
<table id="idmdata" width="48%">
<th><font size="-1">Soll</th>
<th><font size="-1">#</th>
</tr>
<?php
if ($sqlAantalSoll > 0){
while ($sqlDataSoll = mysqli_fetch_assoc($sqlUitlezenSoll)){
?>
<tr>
<td><font size="-2"><?=$sqlDataSoll['S_OU'];?></td>
<td><font size="-2"><?=$sqlDataSoll['Soll'];?></td>
</tr>
<?php
}
}else{
echo '<center>GEEN SOLL GEGEVENS GEVONDEN!</center>';
}
?>
</table>
</div>
<?php
$sqlAantalSoll = mysqli_num_rows($sqlUitlezenSoll);
?>
<table id="idmdata" width="48%">
<th><font size="-1">Soll</th>
<th><font size="-1">#</th>
</tr>
<?php
if ($sqlAantalSoll > 0){
while ($sqlDataSoll = mysqli_fetch_assoc($sqlUitlezenSoll)){
?>
<tr>
<td><font size="-2"><?=$sqlDataSoll['S_OU'];?></td>
<td><font size="-2"><?=$sqlDataSoll['Soll'];?></td>
</tr>
<?php
}
}else{
echo '<center>GEEN SOLL GEGEVENS GEVONDEN!</center>';
}
?>
</table>
</div>
Gewijzigd op 05/12/2020 10:55:58 door - Ariën -
Op regel 7 in de SQL staat een alias p achter FROM idm_person (macht der gewoonte) dit moet je iig weghalen.
Wel vreemd dat je dan geen melding krijgt als:
Code (php)
1
Error( 1054 ) 42S22: "Unknown column 'idm_person.MSKEYVALUE_MEDEWERKER' in 'on clause'"
Toevoeging op 05/12/2020 11:12:26:
@DHU
Op regel 7 in de SQL staat een alias p achter FROM idm_person (macht der gewoonte) dit moet je iig weghalen.
Wel vreemd dat je dan geen melding krijgt als:
- Ariën - op 05/12/2020 10:51:49:
Even een opmerking: Waarom die hele echo-put in een script?
Is dit niet beter leesbaar? Je ziet zo beter onderscheid tussen HTML en PHP, en je hoeft niet meer te escapen.
Verder zijn font-tags verouderd, en kan je de opmaak prima in CSS bewerkstelligen.
Is dit niet beter leesbaar? Je ziet zo beter onderscheid tussen HTML en PHP, en je hoeft niet meer te escapen.
Verder zijn font-tags verouderd, en kan je de opmaak prima in CSS bewerkstelligen.
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<div style="display:inline-block;">';
<?php
$sqlAantalSoll = mysqli_num_rows($sqlUitlezenSoll);
?>
<table id="idmdata" width="48%">
<th><font size="-1">Soll</th>
<th><font size="-1">#</th>
</tr>
<?php
if ($sqlAantalSoll > 0){
while ($sqlDataSoll = mysqli_fetch_assoc($sqlUitlezenSoll)){
?>
<tr>
<td><font size="-2"><?=$sqlDataSoll['S_OU'];?></td>
<td><font size="-2"><?=$sqlDataSoll['Soll'];?></td>
</tr>
<?php
}
}else{
echo '<center>GEEN SOLL GEGEVENS GEVONDEN!</center>';
}
?>
</table>
</div>
<?php
$sqlAantalSoll = mysqli_num_rows($sqlUitlezenSoll);
?>
<table id="idmdata" width="48%">
<th><font size="-1">Soll</th>
<th><font size="-1">#</th>
</tr>
<?php
if ($sqlAantalSoll > 0){
while ($sqlDataSoll = mysqli_fetch_assoc($sqlUitlezenSoll)){
?>
<tr>
<td><font size="-2"><?=$sqlDataSoll['S_OU'];?></td>
<td><font size="-2"><?=$sqlDataSoll['Soll'];?></td>
</tr>
<?php
}
}else{
echo '<center>GEEN SOLL GEGEVENS GEVONDEN!</center>';
}
?>
</table>
</div>
eigenlijk is dat iets wat ik aangeleerd heb.. :-)
die html-tages was probeersel... opmaak verloopt ook voor het leeuwendeel via css hoor maar soms wil ik voor de probeer even daar van afstappen maar hoort daar ook niet. klopt.
Toevoeging op 05/12/2020 16:49:57:
@Ger
Die p als alias verwijderd... en een N toegevoegd aan de laaste GROUB BY maar ben er dan nog niet mee... Nu krijg ik wel een foutmelding.
Deze luidt:
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\wamp64\www\BP\members\functies\audit\soll_ist_systeem_swift_productie_cea.php on line 53
voor de volledig hieronder nog de gehele code.
Toevoeging op 05/12/2020 16:50:45:
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php
function soll_ist_systeem_swift_productie_cea(){
global $connection;
$where = NULL;
if (isset($_GET['doelsysteem'])){
$where = 'WHERE idm_doelsysteem.MSKEYVALUE_DOELSYSTEEM = "'.mysqli_real_escape_string($connection, $_GET['doelsysteem']).'"';
}
$sqlUitlezen = mysqli_query($connection, "SELECT
idm_ou.MSKEYVALUE_OU,
idm_ou.Z_ORG_DN,
COUNT(DISTINCT idm_person2role.MSKEYVALUE_MEDEWERKER) soll,
COUNT(DISTINCT ist_user_swift_productie_cea.Personeelsnummer) ist
FROM
idm_person
INNER JOIN
idm_ou ON idm_ou.MSKEYVALUE_OU = idm_person.ACHMEA_REF_OU
LEFT JOIN
(idm_person2role
INNER JOIN
(SELECT
DISTINCT role2act.MSKEYVALUE_ROL
FROM
idm_autorisatie
INNER JOIN
idm_act2aut ON idm_act2aut.MSKEYVALUE_AUTORISATIE = idm_autorisatie.MSKEYVALUE_AUTORISATIE
INNER JOIN
idm_role2act ON idm_role2act.MSKEYVALUE_ACTIVITEIT = idm_act2aut.MSKEYVALUE_ACTIVITEIT
".$where."
) soll_t ON soll_t.MSKEYVALUE_ROL = idm_person2role.MSKEYVALUE_ROL
) ON idm_person2role.MSKEYVALUE_MEDEWERKER = idm_person.MSKEYVALUE_MEDEWERKER
LEFT JOIN
(ist_user_swift_productie_cea
INNER JOIN
(SELECT
DISTINCT ist_user2aut_swift_productie_cea.gebruikersnaam
FROM
ist_aut_swift_productie_cea
INNER JOIN
ist_user2aut_swift_productie_cea ON ist_user2aut_swift_productie_cea.Autorisatie_naam = ist_aut_swift_productie_cea.Autorisatienaam
) ist_t ON ist_t.gebruikersnaam = ist_user_swift_productie_cea.gebruikersnaam
) ON idm_person.ACHMEA_EMPLOYEENUMBER = ist_user_swift_productie_cea.Personeelsnummer
GROUP BY
idm_ou.MSKEYVALUE_OU,
idm_ou.Z_ORG_DN
");
echo'<div style="display:inline-block;">';
$sqlAantal = mysqli_num_rows($sqlUitlezen);
echo '<table id="idmdata" width="48%">';
echo '<th>Afdeling</th>';
echo '<th>S</th>';
echo '<th>I</th>';
echo '</tr>';
if ($sqlAantal > 0){
while ($sqlData = mysqli_fetch_assoc($sqlUitlezen)){
echo '<tr>';
echo '<td><font size="-1">'.$sqlData['MSKEYVALUE_OU'].' </td>';
echo '<td><font size="-1">'.$sqlData['soll'].' </td>';
echo '<td><font size="-1">'.$sqlData['ist'].' </td>';
echo '</tr>';
}
}else{
echo '<center>GEEN SOLL/IST GEGEVENS GEVONDEN!</center>';
}
echo '</table>';
echo'</div>';
echo '<button class="button1" style="vertical-align:middle"><span><div id="button"><a href="javascript:javascript:history.go(-1)"> Vorige pagina</a></div></span></button>';
}
?>
function soll_ist_systeem_swift_productie_cea(){
global $connection;
$where = NULL;
if (isset($_GET['doelsysteem'])){
$where = 'WHERE idm_doelsysteem.MSKEYVALUE_DOELSYSTEEM = "'.mysqli_real_escape_string($connection, $_GET['doelsysteem']).'"';
}
$sqlUitlezen = mysqli_query($connection, "SELECT
idm_ou.MSKEYVALUE_OU,
idm_ou.Z_ORG_DN,
COUNT(DISTINCT idm_person2role.MSKEYVALUE_MEDEWERKER) soll,
COUNT(DISTINCT ist_user_swift_productie_cea.Personeelsnummer) ist
FROM
idm_person
INNER JOIN
idm_ou ON idm_ou.MSKEYVALUE_OU = idm_person.ACHMEA_REF_OU
LEFT JOIN
(idm_person2role
INNER JOIN
(SELECT
DISTINCT role2act.MSKEYVALUE_ROL
FROM
idm_autorisatie
INNER JOIN
idm_act2aut ON idm_act2aut.MSKEYVALUE_AUTORISATIE = idm_autorisatie.MSKEYVALUE_AUTORISATIE
INNER JOIN
idm_role2act ON idm_role2act.MSKEYVALUE_ACTIVITEIT = idm_act2aut.MSKEYVALUE_ACTIVITEIT
".$where."
) soll_t ON soll_t.MSKEYVALUE_ROL = idm_person2role.MSKEYVALUE_ROL
) ON idm_person2role.MSKEYVALUE_MEDEWERKER = idm_person.MSKEYVALUE_MEDEWERKER
LEFT JOIN
(ist_user_swift_productie_cea
INNER JOIN
(SELECT
DISTINCT ist_user2aut_swift_productie_cea.gebruikersnaam
FROM
ist_aut_swift_productie_cea
INNER JOIN
ist_user2aut_swift_productie_cea ON ist_user2aut_swift_productie_cea.Autorisatie_naam = ist_aut_swift_productie_cea.Autorisatienaam
) ist_t ON ist_t.gebruikersnaam = ist_user_swift_productie_cea.gebruikersnaam
) ON idm_person.ACHMEA_EMPLOYEENUMBER = ist_user_swift_productie_cea.Personeelsnummer
GROUP BY
idm_ou.MSKEYVALUE_OU,
idm_ou.Z_ORG_DN
");
echo'<div style="display:inline-block;">';
$sqlAantal = mysqli_num_rows($sqlUitlezen);
echo '<table id="idmdata" width="48%">';
echo '<th>Afdeling</th>';
echo '<th>S</th>';
echo '<th>I</th>';
echo '</tr>';
if ($sqlAantal > 0){
while ($sqlData = mysqli_fetch_assoc($sqlUitlezen)){
echo '<tr>';
echo '<td><font size="-1">'.$sqlData['MSKEYVALUE_OU'].' </td>';
echo '<td><font size="-1">'.$sqlData['soll'].' </td>';
echo '<td><font size="-1">'.$sqlData['ist'].' </td>';
echo '</tr>';
}
}else{
echo '<center>GEEN SOLL/IST GEGEVENS GEVONDEN!</center>';
}
echo '</table>';
echo'</div>';
echo '<button class="button1" style="vertical-align:middle"><span><div id="button"><a href="javascript:javascript:history.go(-1)"> Vorige pagina</a></div></span></button>';
}
?>
Ger van Steenderen op 05/12/2020 19:46:23:
thnx.... zat idd een verwijzing naar een tabel die die niet bestond (oopsie).... issue herstel... de tabellen lijken gevonden maar krijg nu een andere een melding over een unknown column in field list. Dus ben weer opnieuw aan googlen naar deze melding
Wat is nu de volledige foutmelding?
- Ariën - op 05/12/2020 21:53:08:
Wat is nu de volledige foutmelding?
Het lijkt er op dat ik de unknown colums (3x) het weten te tacklen. Bij het aanroepen van deze functie komt er nu (vooralsnog) geen foutmelding naar voren... maar uhm, d'r komt ook niet anders naar voren. De brouwser blijf maar laden..... na zo'n 10 minuten nog steeds niets leesbaars op scherm... zit dus ergens nog niet iets jofiaals
Toevoeging op 05/12/2020 22:21:43:
- DHU - op 05/12/2020 22:12:10:
Het lijkt er op dat ik de unknown colums (3x) het weten te tacklen. Bij het aanroepen van deze functie komt er nu (vooralsnog) geen foutmelding naar voren... maar uhm, d'r komt ook niet anders naar voren. De brouwser blijf maar laden..... na zo'n 10 minuten nog steeds niets leesbaars op scherm... zit dus ergens nog niet iets jofiaals
- Ariën - op 05/12/2020 21:53:08:
Wat is nu de volledige foutmelding?
Het lijkt er op dat ik de unknown colums (3x) het weten te tacklen. Bij het aanroepen van deze functie komt er nu (vooralsnog) geen foutmelding naar voren... maar uhm, d'r komt ook niet anders naar voren. De brouwser blijf maar laden..... na zo'n 10 minuten nog steeds niets leesbaars op scherm... zit dus ergens nog niet iets jofiaals
Uiteindelijk na 15 minuten de boel maar geforceerd onderbroken en de webserver services maar opnieuw herstart. De code toch maar weer induiken ben ik bang :-)
Overigens is die SELECT DISTINCT een indicatie dat je naar de indices wilt kijken, tenzij performance geen issue is.
Ad Fundum op 07/12/2020 13:32:26:
Het helpt niet als ik nog eens wijs om het te proberen met een FULL OUTER JOIN? Scheelt werk volgens mij.
Overigens is die SELECT DISTINCT een indicatie dat je naar de indices wilt kijken, tenzij performance geen issue is.
Overigens is die SELECT DISTINCT een indicatie dat je naar de indices wilt kijken, tenzij performance geen issue is.
Toevoeging op 07/12/2020 16:45:35:
Ad Fundum op 07/12/2020 13:32:26:
Het helpt niet als ik nog eens wijs om het te proberen met een FULL OUTER JOIN? Scheelt werk volgens mij.
Overigens is die SELECT DISTINCT een indicatie dat je naar de indices wilt kijken, tenzij performance geen issue is.
[/quotr]
Waarom zou dat net helpen? alle opties staan toch open... maar dit stukje raakt ook behoorlijk de technische inzicht.. dat gaat niet zo super hard.. en overal moet ik op inlezen.. maar aanbod is zo hoog dat je als 'leek' je ook altijd moet afvragen is de info die ik lees de juiste... en officiele php site gaat behoorljk de techniek in..
voor mijn vraag wil ik ook wel vergoeding tegenover zetten wanneer deze in verhouding ligt... maar daar wil wel een een 'vacature' voor plaatsn...
Overigens is die SELECT DISTINCT een indicatie dat je naar de indices wilt kijken, tenzij performance geen issue is.
[/quotr]
Waarom zou dat net helpen? alle opties staan toch open... maar dit stukje raakt ook behoorlijk de technische inzicht.. dat gaat niet zo super hard.. en overal moet ik op inlezen.. maar aanbod is zo hoog dat je als 'leek' je ook altijd moet afvragen is de info die ik lees de juiste... en officiele php site gaat behoorljk de techniek in..
voor mijn vraag wil ik ook wel vergoeding tegenover zetten wanneer deze in verhouding ligt... maar daar wil wel een een 'vacature' voor plaatsn...
Je bent vrij om een vacature te plaatsen in het vacatureforum. Lees wel a.u.b. de criteria.
- DHU - op 07/12/2020 16:42:00:
Waarom zou dat net helpen? alle opties staan toch open... maar dit stukje raakt ook behoorlijk de technische inzicht.. dat gaat niet zo super hard.. en overal moet ik op inlezen.. maar aanbod is zo hoog dat je als 'leek' je ook altijd moet afvragen is de info die ik lees de juiste... en officiele php site gaat behoorljk de techniek in..
Het is niet zo zeer een php ding (tenzij je een oneindige loop hebt) maar een SQL.
Ik had de subqueries erin gezet om duidelijk te maken wat er gebeurt maar deze zijn over het algemeen niet bevorderlijk voor de performance.
Aangepast:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
idm_person.REF_OU,
COUNT(DISTINCT idm_person2role.MSKEYVALUE_MEDEWERKER) soll,
COUNT(DISTINCT ist_user2aut_swift_productie_cea.gebruikersnaam) ist
FROM
idm_autorisatie
INNER JOIN
idm_act2aut ON idm_act2aut.MSKEYVALUE_AUTORISATIE = idm_autorisatie.MSKEYVALUE_AUTORISATIE
INNER JOIN
idm_role2act ON idm_role2act.MSKEYVALUE_ACTIVITEIT = idm_act2aut.MSKEYVALUE_ACTIVITEIT
INNER JOIN
idm_person2role ON idm_person2role.MSKEYVALUE_ROL = idm_role2act.MSKEYVALUE_ROL
RIGHT JOIN
idm_person ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
AND idm_autorisatie.MSKEYVALUE_DOELSYSTEEM = 'waarde van $_GET'
LEFT JOIN
ist_user2aut_swift_productie_cea ON idm_person.ACCOUNTNAME = ist_user2aut_swift_productie_cea.gebruikersnaam
GROUP BY
idm_person.REF_OU
idm_person.REF_OU,
COUNT(DISTINCT idm_person2role.MSKEYVALUE_MEDEWERKER) soll,
COUNT(DISTINCT ist_user2aut_swift_productie_cea.gebruikersnaam) ist
FROM
idm_autorisatie
INNER JOIN
idm_act2aut ON idm_act2aut.MSKEYVALUE_AUTORISATIE = idm_autorisatie.MSKEYVALUE_AUTORISATIE
INNER JOIN
idm_role2act ON idm_role2act.MSKEYVALUE_ACTIVITEIT = idm_act2aut.MSKEYVALUE_ACTIVITEIT
INNER JOIN
idm_person2role ON idm_person2role.MSKEYVALUE_ROL = idm_role2act.MSKEYVALUE_ROL
RIGHT JOIN
idm_person ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
AND idm_autorisatie.MSKEYVALUE_DOELSYSTEEM = 'waarde van $_GET'
LEFT JOIN
ist_user2aut_swift_productie_cea ON idm_person.ACCOUNTNAME = ist_user2aut_swift_productie_cea.gebruikersnaam
GROUP BY
idm_person.REF_OU
Ik heb tabel- en kolomnamen overgenomen uit jouw tweede reactie.
Wederom is mijn dank groot voor het aandragen van de code... maar ook blijf de browser maar pollen en komt er geen resultaat op scherm. Ik wil je bedanken maar ik zet het voor nu allemaal maar even in de ijskast. Ik snap gewoon niet wat er gaande is en het is voor mij niet te volgen. Het is verdomd lastig als je hier geen cursus in hebt gevolgd of dat je van niemand tekst en uitleg krijgt. Ik zou je inzet wel willen belonen voor de inspanning maar laten we die dan even buiten hier houden. Je hebt er nu al zoveel tijd ingestoken. Neem aub even contact op voor afstemming.
Dank je wel en de rest natuurlijk ook voor het meedenken.
Toevoeging op 08/12/2020 22:07:42:
Hoi Ger,
Wederom is mijn dank groot voor het aandragen van de code... maar ook blijf de browser maar pollen en komt er geen resultaat op scherm. Ik wil je bedanken maar ik zet het voor nu allemaal maar even in de ijskast. Ik snap gewoon niet wat er gaande is en het is voor mij niet te volgen. Het is verdomd lastig als je hier geen cursus in hebt gevolgd of dat je van niemand tekst en uitleg krijgt. Ik zou je inzet wel willen belonen voor de inspanning maar laten we die dan even buiten hier houden. Je hebt er nu al zoveel tijd ingestoken. Neem aub even contact op voor afstemming.
Dank je wel en de rest natuurlijk ook voor het meedenken.
Voor wanneer je het weer op wilt pakken: in SQL is alles een tabel, zoals de output van een SELECT-statement. Je kunt die output direct hergebruiken in een ander SELECT-statement.
Met een UNION plak je de output van twee tabellen onder elkaar, maar dat is niet wat je wilt.
Wat je wilt is dat de resultaten naast elkaar vergeleken worden.
Dat kan je doen met een JOIN bij het FROM-statement:
- een INNER JOIN geeft alle rijen die in beide sets voorkomen
- een LEFT JOIN (of omgekeerd: RIGHT JOIN) geeft alle rijen die in de ene set voorkomen, en eventueel die van de andere
- een (FULL) OUTER JOIN geeft rijen die in de ene en/of andere set voorkomen
Als je vanuit een SQL-client werkt (HeidiSQL, TOra, ...) kan je een al een SELECT-statement schrijven die alle resultaten geeft die je nodig hebt, via een FULL OUTER JOIN. En later stop je die werkende query in PHP, voor het mooi presenteren in HTML.
Het gaat dus om SQL.
Om te beginnen schrijf je twee werkende SELECT-queries voor de twee systemen (IST en SOLL), waaruit alle data komt die je wilt vergelijken of wilt laten zien in het rapport.
Vervolgens zet je de output van die twee queries in een FULL OUTER JOIN voor de vergelijking.
Je gebruikt mysqli_*() dus je database zal zijn in MySQL of MariaDB, die allebei geen FULL OUTER JOIN ondersteunen.
Maar het kan met een omweg. Bijvoorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
WITH `ist` AS (
SELECT -- van de IST-omgeving
),
`soll` AS (
SELECT -- van de SOLL-omgeving
)
SELECT *
FROM `ist`
LEFT JOIN `soll`
ON `ist`.`id` = `soll`.`id`
UNION SELECT *
FROM `ist`
RIGHT JOIN `soll`
ON `ist`.`id` = `soll`.`id`
WHERE `ist`.`id` IS NULL;
SELECT -- van de IST-omgeving
),
`soll` AS (
SELECT -- van de SOLL-omgeving
)
SELECT *
FROM `ist`
LEFT JOIN `soll`
ON `ist`.`id` = `soll`.`id`
UNION SELECT *
FROM `ist`
RIGHT JOIN `soll`
ON `ist`.`id` = `soll`.`id`
WHERE `ist`.`id` IS NULL;
Details: https://dev.mysql.com/doc/refman/8.0/en/outer-join-simplification.html
Om de soll-positie te kunnen vaststellen dien ik gebruik te maken van een autorisatietabel met liefst 5 inner joins om te kunnen bepalen door wie en waar deze in gebruik zijn. De route is: activiteit->act2aut->role2act-person2role->person->ou.
Met name de laatste inner join wordt als niet plezierig ervaren want dan kom ik niet tot resutlaat. Al ik de OU-tabel niet gebruik dan is no issue, maar tja ik heb die laatste tabel net nodig voor aanvullende info wat daar in staat.
Na zo'n 10 minuten pollen forceer ik dan maar weer 'n herstart van mijn wampserver. Kan dit ook bijv ook liggen aan Wampserver of is die conclusie te voorbarig?
Toevoeging op 12/12/2020 10:04:56:
Thxn 4 the input en voor het meedenken. Geldt voor iedereen die met me meedenkt. Ben hier eens voorzicht mee aan het experimenteren geweest maar ik loop tegen een performance (?) issue aan denk ik die ik eerst moet zien te tacklen.
Om de soll-positie te kunnen vaststellen dien ik gebruik te maken van een autorisatietabel met liefst 5 inner joins om te kunnen bepalen door wie en waar deze in gebruik zijn. De route is: activiteit->act2aut->role2act-person2role->person->ou.
Met name de laatste inner join wordt als niet plezierig ervaren want dan kom ik niet tot resutlaat. Al ik de OU-tabel niet gebruik dan is no issue, maar tja ik heb die laatste tabel net nodig voor aanvullende info wat daar in staat.
Na zo'n 10 minuten pollen forceer ik dan maar weer 'n herstart van mijn wampserver. Kan dit ook bijv ook liggen aan Wampserver of is die conclusie te voorbarig?
- DHU - op 08/12/2020 21:40:42:
Wederom is mijn dank groot voor het aandragen van de code... maar ook blijf de browser maar pollen en komt er geen resultaat op scherm.
- DHU - op 12/12/2020 09:57:51:
Met name de laatste inner join wordt als niet plezierig ervaren want dan kom ik niet tot resutlaat. Al ik de OU-tabel niet gebruik dan is no issue, maar tja ik heb die laatste tabel net nodig voor aanvullende info wat daar in staat.
Die tabel stond ook niet in het voorbeeld wat ik gaf, heb je die zelf alsnog toegevoegd?
Want als die de veroorzaker is van het perfomance probleem:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT x.*, idm_ou.Z_ORG_DN
FROM
(SELECT
idm_person.REF_OU,
COUNT(DISTINCT idm_person2role.MSKEYVALUE_MEDEWERKER) soll,
COUNT(DISTINCT ist_user2aut_swift_productie_cea.gebruikersnaam) ist
FROM
idm_autorisatie
INNER JOIN
idm_act2aut ON idm_act2aut.MSKEYVALUE_AUTORISATIE = idm_autorisatie.MSKEYVALUE_AUTORISATIE
INNER JOIN
idm_role2act ON idm_role2act.MSKEYVALUE_ACTIVITEIT = idm_act2aut.MSKEYVALUE_ACTIVITEIT
INNER JOIN
idm_person2role ON idm_person2role.MSKEYVALUE_ROL = idm_role2act.MSKEYVALUE_ROL
RIGHT JOIN
idm_person ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
AND idm_autorisatie.MSKEYVALUE_DOELSYSTEEM = 'waarde van $_GET'
LEFT JOIN
ist_user2aut_swift_productie_cea ON idm_person.ACCOUNTNAME = ist_user2aut_swift_productie_cea.gebruikersnaam
GROUP BY
idm_person.REF_OU) x
INNER JOIN
idm_ou On idm_ou.MSKEYVALUE_OU = x.REF_OU
FROM
(SELECT
idm_person.REF_OU,
COUNT(DISTINCT idm_person2role.MSKEYVALUE_MEDEWERKER) soll,
COUNT(DISTINCT ist_user2aut_swift_productie_cea.gebruikersnaam) ist
FROM
idm_autorisatie
INNER JOIN
idm_act2aut ON idm_act2aut.MSKEYVALUE_AUTORISATIE = idm_autorisatie.MSKEYVALUE_AUTORISATIE
INNER JOIN
idm_role2act ON idm_role2act.MSKEYVALUE_ACTIVITEIT = idm_act2aut.MSKEYVALUE_ACTIVITEIT
INNER JOIN
idm_person2role ON idm_person2role.MSKEYVALUE_ROL = idm_role2act.MSKEYVALUE_ROL
RIGHT JOIN
idm_person ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
AND idm_autorisatie.MSKEYVALUE_DOELSYSTEEM = 'waarde van $_GET'
LEFT JOIN
ist_user2aut_swift_productie_cea ON idm_person.ACCOUNTNAME = ist_user2aut_swift_productie_cea.gebruikersnaam
GROUP BY
idm_person.REF_OU) x
INNER JOIN
idm_ou On idm_ou.MSKEYVALUE_OU = x.REF_OU
Door de OU-tabel uit de group by te halen kan je een hoop winst boeken.
Gewijzigd op 13/12/2020 10:59:25 door Ger van Steenderen