Page 4 of 5
Re: insert multiple lines in a subform.
Posted: Thu Jul 22, 2021 10:15 am
by kev1n
Try with this updated code:
Code: Select all
// Fields of Main from
$actDateStart = "#act_start#";
$actDateEnd = "#act_eind#";
$actTimeStart = "#act_uur_start#";
$actTimeEnd = "#act_uur_end#";
$actLocation = "#act_lokaal#";
// Get all dates from start to end
$dates = dateRange($actDateStart, $actDateEnd);
$msg = "";
// Loop through dates
foreach ($dates as $date) {
// Check in reservaties if there's already a row with the same date, "lookal" etc.
$sql = "
SELECT * FROM
reservaties
WHERE
res_datum = :act_date AND
res_lokaal = :act_location
-- add other criterias here
";
// sql arguments
$arg = array(
"act_date" => $date,
"act_lokaal" => $actLocation,
"act_uur_start" => $actTimeStart,
"act_uur_end" => $actTimeEnd
);
$r = nuRunQuery($sql, $arg);
if (db_num_rows($r) != 0) {
$mgs .= "Not available on $date";
}
}
if ($msg != '') {
nuDisplayError($msg);
} else {
nuDisplayError("Free.");
foreach ($dates as $date){
addReservation($date, $actTimeStart, $actTimeEnd , $res_lokaal);
}
}
function dateRange( $first, $last, $step = '+1 day', $format = 'Y-m-d' ) {
$dates = [];
$current = strtotime( $first );
$last = strtotime( $last );
while( $current <= $last ) {
$dates[] = date( $format, $current );
$current = strtotime( $step, $current );
}
return $dates;
}
function addReservation($res_datum, $actTimeStart,$actTimeEnd, $res_lokaal) {
$q = "
INSERT INTO reservaties (res_id, res_datum, actTimeStart, actTimeEnd, res_lokaal)
VALUES(?,?,?,?,?)
";
$t = nuRunQuery($q, [nuID(), $res_datum, $actTimeStart, $actTimeEnd, $res_lokaal]);
}
Re: insert multiple lines in a subform.
Posted: Thu Jul 22, 2021 11:15 am
by johan
Kev1n
Now I get an insert in my table reservatie.
I'm missing the foreignKey (id of form) and my dates are 1921-07-22
Johan
Re: insert multiple lines in a subform.
Posted: Thu Jul 22, 2021 11:33 am
by kev1n
I added the FK in the function addReservation().
Place the code in the AS (After Save) event instead of executing a Procedure, otherwise it won't work since the parent records needs to be saved first.
I also added a convertDate() function to convert the date of format dd.mm.yy to yyyy-mm-dd
Code: Select all
// Fields of Main from
$actDateStart = convertDate("#act_start#");
$actDateEnd = convertDate("#act_eind#");
$actTimeStart = "#act_uur_start#";
$actTimeEnd = "#act_uur_end#";
$actLocation = "#act_lokaal#";
// Get all dates from start to end
$dates = dateRange($actDateStart, $actDateEnd);
$msg = "";
// Loop through dates
foreach ($dates as $date) {
// Check in reservaties if there's already a row with the same date, "lookal" etc.
$sql = "
SELECT * FROM
reservaties
WHERE
res_datum = :act_date AND
res_lokaal = :act_location
-- add other criterias here
";
// sql arguments
$arg = array(
"act_date" => $date,
"act_lokaal" => $actLocation,
"act_uur_start" => $actTimeStart,
"act_uur_end" => $actTimeEnd
);
$r = nuRunQuery($sql, $arg);
if (db_num_rows($r) != 0) {
$mgs .= "Not available on $date";
}
}
if ($msg != '') {
nuDisplayError($msg);
} else {
nuDisplayError("Free.");
foreach ($dates as $date){
addReservation($date, $actTimeStart, $actTimeEnd , $res_lokaal);
}
}
function dateRange( $first, $last, $step = '+1 day', $format = 'Y-m-d' ) {
$dates = [];
$current = strtotime( $first );
$last = strtotime( $last );
while( $current <= $last ) {
$dates[] = date( $format, $current );
$current = strtotime( $step, $current );
}
return $dates;
}
function addReservation($res_datum, $actTimeStart,$actTimeEnd, $res_lokaal) {
$q = "
INSERT INTO reservaties (res_id, res_act_id, res_datum, actTimeStart, actTimeEnd, res_lokaal)
VALUES(?,?,?,?,?)
";
$t = nuRunQuery($q, [nuID(), "#RECORD_ID#", $res_datum, $actTimeStart, $actTimeEnd, $res_lokaal]);
}
// Convert a date of format dd.mm.yy --> yyyy-mm-dd
function convertDate($d) {
$date = str_replace('.', '-', $d);
return date('Y-m-d', strtotime($date));
}
Re: insert multiple lines in a subform.
Posted: Thu Jul 22, 2021 12:02 pm
by johan
Ok this works if there is no date in the array where the room is busy.
Re: insert multiple lines in a subform.
Posted: Thu Jul 22, 2021 4:58 pm
by kev1n
johan wrote:Ok this works if there is no date in the array where the room is busy.
Can you give some more details on what works and what does not work?
Re: insert multiple lines in a subform.
Posted: Thu Jul 22, 2021 7:47 pm
by johan
Kev1n
In after save my rows are inserted when saving.
I have to check my SQL because the result is always free, even with duplicate rows.
With procedure same result if I run procedure on saved form. Maybe an option to hide subform on a new form and renew page at the end of the procedure?
Johan
What I miss is the part where occupied dates are inserted without room or room 0
Re: insert multiple lines in a subform.
Posted: Thu Jul 22, 2021 8:23 pm
by kev1n
Did you add the other criteria in this SQL?
Code: Select all
// Check in reservaties if there's already a row with the same date, "lookal" etc.
$sql = "
SELECT * FROM
reservaties
WHERE
res_datum = :act_date AND
res_lokaal = :act_location
-- add other criteria here
";
Here's the updated SQL that inserts the rows in the subform. I think you just need to update the SQL above in order to detect occupied locations (or are they rooms?)
Code: Select all
// Fields of Main from
$actDateStart = convertDate("#act_start#");
$actDateEnd = convertDate("#act_eind#");
$actTimeStart = "#act_uur_start#";
$actTimeEnd = "#act_uur_end#";
$actLocation = "#act_lokaal#";
$actParticipants = "#act_deelnemers#";
// Get all dates from start to end
$dates = dateRange($actDateStart, $actDateEnd);
$msg = "";
// Loop through dates
foreach ($dates as $date) {
// Check in reservaties if there's already a row with the same date, "lookal" etc.
$sql = "
SELECT * FROM
reservaties
WHERE
res_datum = :act_date AND
res_lokaal = :act_location
-- add other criterias here
";
// sql arguments
$arg = array(
"act_date" => $date,
"act_lokaal" => $actLocation,
"act_uur_start" => $actTimeStart,
"act_uur_end" => $actTimeEnd
);
$r = nuRunQuery($sql, $arg);
if (db_num_rows($r) != 0) {
$mgs .= "Not available on $date";
}
}
if ($msg != '') {
nuDisplayError($msg);
} else {
nuDisplayError("Free.");
foreach ($dates as $date){
addReservation($date, $actTimeStart, $actTimeEnd , $actLocation, $actParticipants);
}
}
function dateRange( $first, $last, $step = '+1 day', $format = 'Y-m-d' ) {
$dates = [];
$current = strtotime( $first );
$last = strtotime( $last );
while( $current <= $last ) {
$dates[] = date( $format, $current );
$current = strtotime( $step, $current );
}
return $dates;
}
function addReservation($res_datum, $actTimeStart, $actTimeEnd, $actLocation, $actParticipants) {
$q = "
INSERT INTO reservaties (res_id, res_act_id, res_datum, res_uur_start, res_uur_eind, res_lokaal, res_deelnemers)
VALUES(?,?,?,?,?,?,?)
";
$t = nuRunQuery($q, [nuID(), "#RECORD_ID#", $res_datum, $actTimeStart, $actTimeEnd, $actLocation, $actParticipants]);
}
// Convert a date of format dd.mm.yy --> yyyy-mm-dd
function convertDate($d) {
$date = str_replace('.', '-', $d);
return date('Y-m-d', strtotime($date));
}
Important: You will need the updated
nuformclass.js that fixes a year bug when using a two-digit year.
Re: insert multiple lines in a subform.
Posted: Fri Jul 23, 2021 9:27 am
by johan
Kev1n
This is the code that I use in procedure.
- The SQL part gives no result, even with "select * from reservaties" the result is always empty. Can I use nuDebug to see the result of the query?
- Now he inserts every row 2 times.
Code: Select all
// Fields of Main from
$actDateStart = convertDate("#act_start#");
$actDateEnd = convertDate("#act_eind#");
$actTimeStart = "#act_uur_start#";
$actTimeEnd = "#act_uur_eind#";
$actLocation = "#act_lokaal#";
$actID = "#act_id#";
// Get all dates from start to end
$dates = dateRange($actDateStart, $actDateEnd);
$msg = "";
// Loop through dates
foreach ($dates as $date) {
// Check in reservaties if there's already a row with the same date, "lookal" etc.
$sql = "
SELECT * FROM
reservaties
WHERE
res_datum = :act_start AND
res_lokaal = :act_lokaal AND
res_uur_start = :act_uur_start AND
res_uur_eind = :act_uur_eind
-- add other criterias here
";
// sql arguments
$arg = array(
"act_date" => $date,
"act_lokaal" => $actLocation,
"act_uur_start" => $actTimeStart,
"act_uur_eind" => $actTimeEnd
);
$r = nuRunQuery($sql, $arg);
if (db_num_rows($r) != 0) {
$mgs .= "Not available on $date";
}
}
if ($msg != '') {
nuDisplayError($msg);
} else {
nuDisplayError("Free.");
foreach ($dates as $date){
addReservation($actID, $date, $actTimeStart, $actTimeEnd , $actLocation);
}
}
function dateRange( $first, $last, $step = "+#act_ritme#" , $format = 'Y-m-d' ) {
$dates = [];
$current = strtotime( $first );
$last = strtotime( $last );
while( $current <= $last ) {
$dates[] = date( $format, $current );
$current = strtotime( $step, $current );
}
return $dates;
}
function addReservation($actID,$res_datum, $actTimeStart,$actTimeEnd, $actLocation) {
$q = "
INSERT INTO reservaties (res_id, res_act_id, res_datum, res_uur_start, res_uur_eind, res_lokaal)
VALUES(?,?,?,?,?,?)
";
$t = nuRunQuery($q, [nuID(), $actID, $res_datum, $actTimeStart, $actTimeEnd, $actLocation]);
}
// Convert a date of format dd.mm.yy --> yyyy-mm-dd
function convertDate($d) {
$date = str_replace('.', '-', $d);
return date('Y-m-d', strtotime($date));
}
Re: insert multiple lines in a subform.
Posted: Fri Jul 23, 2021 11:43 am
by kev1n
:act_start is supposed to be :act_date, see my previous post.
Re: insert multiple lines in a subform.
Posted: Fri Jul 23, 2021 1:34 pm
by johan
Kev1n
Same result.
When I replace the query with query below, I still get free. If I run that query in MariaDB I get 19 rows.
Code: Select all
SELECT * FROM
reservaties
WHERE
res_datum = '2021-07-19'