Voorwaarde : eerst input uitvoeren en dan pas verder gaan

Status
Niet open voor verdere reacties.

leifoet

Gebruiker
Lid geworden
7 okt 2007
Berichten
326
Met een 'do while' wordt een tabel doorlopen.
Elementen van die tabel zijn onderheving aan wijzigingen die telkens via een input ingevoerd worden.

Zoek een mogelijkheid om 'do while' telkens te pauzeren tot de 'input' van het betreffend element is uitgevoerd.
Code:
do while ..
  toont element 1  => input wijzigen
  pas dan element 2 tonen => input wijzigen 
  pas dan element 3 tonen => input wijzigen  
  ...
(eof)

Dank voor tips.
 
Laatst bewerkt door een moderator:
Waar gaat dit over?
PHP, Perl, Asp.net, VB.net, C#, C++, JavaScript, GoLang?
 
Om te zorgen dat de 'do while' loop pauzeert totdat de wijzigingen voor het huidige element zijn doorgevoerd, kun je gebruik maken van een bepaalde voorwaarde in de lus.

Je kan proberen om de 'do while' loop te vervangen door een 'for' loop, waarbij je de huidige index bijhoudt. In de 'for' loop kun je vervolgens voor elk element de nodige input vragen en de wijzigingen doorvoeren voordat je doorgaat naar het volgende element.
 
Het lukt nog steeds niet om nà elke getoond element/naam in een lus te pauzeren, om telkens de bijhorende input(regel) te kunnen afwerken - niet met Do ... While, ook niet met For ... Next.
Inputregel :
Code:
<td><input type="submit" name="SVA" value="Nieuwe gegevens bevestigen"></td></tr>
Tot nu toe worden alle namen telkens gevolgd door de inputregel nà elkaar getoond als één lange lijst.

Ter verduidelijking nog dit :
- de lus start met <FORM METHOD="post" ... > en eindigt met <Input> gevolgd door </FORM>. PAS NA het aanklikken van <Gegevens bevestigen> zou de lus naar de volgende naam moeten leiden
- zonder de lus, dus met één naam 'per sessie' werkt input probleemloos > vandaar het lus-idee telkens met een pauze voor de input op de juiste naam

Dank voor tips om verder te kunnen (k)lussen.
 
Laatst bewerkt:
Met do....whilte of een andere lus in ASP (de backend) kan je niet tegen de browser (de frontend) zeggen dat de browser moet wachten. De browser zal de hele pagina renderen, dus ook het hele formulier wordt compleet getoond zonder ergens te wachten.

Met type="submit" verstuur je het formulier (tenzij JavaScript dit voorkomt) met de ingevulde gegevens. Na het versturen is het aan jou wat je met de formulier gegevens in ASP wilt doen. Als je de gegevens gebruikt om opnieuw het formulier te tonen dan wordt de pagina met het formulier opnieuw compleet gerenderd (compleet getoond), je kan ook dan nergens "even wachten".

De enige invloed die je in de browser kan uitoefenen nadat de pagina is gerenderd kan je doen met JavaScript. Je kan met JavaScript bepalen hoe formuliervelden reageren en hoe de submit knop iets moet doen. Ook kan je in JavaScript met timers werken.
 
@bron - als ik het goed begrijp is het onderbreken van een do while geen oplossing en ook JavaScript nà het displayen van de pagina biedt geen uitweg.
Als dat niet kan - hoe dan wel - dan zou ik bijvoorbeeld van do while ... loop een afzonderlijk programma maken waarin telkens met server.execute naar de uitvoering van de input (voor die geselecteerde naam) gesprongen en teruggekeerd wordt. Of kom ik dan terug in hetzelfde doodlopend straatje als hierboven ?
Tenzij er toch nog elegantere/valabele oplossingen zouden zijn.
Dank in elk geval voor de toelichting omtrent de eigenschappen van de lus(sen).
 
Laatst bewerkt:
JavaScript nà het displayen van de pagina biedt geen uitweg.
Met JavaScript lukt het wel maar ik begrijp nog niet helemaal je vraag.
#1: toont element 1 => input wijzigen.
Wat bedoel je met element 1?
#5: Pas na het aanklikken van <Gegevens bevestigen> zou de lus naar de volgende naam moeten leiden
Wat bedoel je met "volgende naam"?

Is het de bedoeling dat telkens als er iets is ingevuld dit in ASP wordt verwerkt?
(bijvoorbeeld een berekening met de input-waarde of opslaan in database)

Is het een vast aantal inputs die je 1 voor 1 laat zien? Of varieert het aantal inputs?

Kan je de html van het <form>....</form> laten zien, bijv. op jsfiddle.net
(code erin plakken, dan op <Save> klikken, en dan url van adresbalk hier in berichtje zetten)
 
De structuur van de module met bestaand en nieuw ziet eruit als volgt (herleid tot de essentie)

=> Een (bestaand) formulier biedt de mogelijkheid via <option> om gegevens (aan- of afwezigheden) van één persoon (per doorloop) te wijzigen - het resultaat ervan wordt via <input> geüpdatet naar de database.
Die één persoon doet zelf zijn eigen wijzigingen en is dus al 'bekend'. Deze oorspronkelijke combinatie (A) werkt nog steeds probleemloos en wil ik ook verder behouden.

=> Mijn bedoeling is nu om ook een lijst met een vast aantal personen (uit de database) de bovenstaande module (A) te laten doorlopen (in globo).
Om de namen te doorlopen was ik van mening dat ik met een do while 'rond' de combinatie A te 'bouwen', vlotjes de updates van dit vast aantal personen naar de database zou kunnen uitvoeren, inclusief dus telkens een <input>stop om eventuele optionwijzingen te kunnen doorsturen naar de database.

Zoals al eerder vermeld krijg ik nu alle namen mét telkens hun opties én telkens de <input> onder elkaar opgelijst.
In mijn bestaande module worden de opties van persoon A weggeschreven door persoon A en daarmee stopt het. Persoon B wijzigt op een ander tijdstip zijn B-gegevens. Vandaar dat ik de lijst probeer te pauzeren om ze te herleiden tot zoveel maal 1 persoon, passend in mijn bestaande module ... tot EOF.
(De volledige lijst met alle namen en hun opties ineens onderaan de hele lijst updaten zou prachtig zijn, maar dat zie ik nog niet zitten.)

Ik hoop dat mijn intentie hiermee duidelijker is : ik zoek (in de eerste plaats) naar de mogelijkheid om de do while de lijst 'te herleiden' tot x maal 1 persoon, passend in mijn module A.
Dank voor tips.
 
Laatst bewerkt:
Er zijn heel veel aannames die ik moet doen en de kans is daardoor zeer groot dat oplossingen niet werken en het veel tijd in beslag gaat nemen. Helaas kan ik in deze vraag niet helpen :confused: Misschien ken je iemand die de code kan inzien voor deze vraag.
 
loops zijn zelden het beste idee. Waarom geen doorlopende lijst met alle te bevestigen namen en de optie om deze aanwezig te zetten. Dan kan de gebruiker alle namen in één keer overzien, doorlopen en aanpassen. En dan het complete resultaat naar de database in één keer doorsturen. Als gebruiker zou ik gek worden om alle namen één voor één te moeten valideren.
 
@bron, sub #8 lees ik
Met JavaScript lukt het wel
- al je hiermee het pauzeren van de do while bedoelt, zou ik dat zeker willen proberen - mag ik vragen naar de naam van dit script ? Overigens dank voor alle moeite.

@NoellaG, sub #9 postte ik :
(De volledige lijst met alle namen en hun opties ineens onderaan de hele lijst updaten zou prachtig zijn, maar dat zie ik nog niet zitten.)
- ben het dus absoluut volledig eens, alleen heb ik nu enkel de ervaring om met de uit <Form> genereerde Request.Form ("XYZ")-velden één persoon per keer te updaten naar de database, maar nog niet de knowhow om een aantal personen mét hun <options> ineens te updaten.
Overigens zou een bruikbaar script daarvoor een gewaardeerde tip zijn.
 
Laatst bewerkt:
Met JavaScript lukt het wel
- al je hiermee het pauzeren van de do while bedoelt
Daarmee kan je niet een loop pauzeren.
Er is geen "standaard" script voor de toepassing zoals je die hebt in jouw formulier.

Ik kan mij helemaal vinden in het bericht van NoellaG. Dit betekent dat je zou moeten verdiepen in hoe je alle inputs van het formulier in 1 keer uitleest en dan in 1 update naar de database schrijft. Elke input moet een unieke name="...." hebben anders werkt het sowieso niet.
 
Eerst en vooral zou ik niet de link op name leggen, maar op het ID veld (primary key), dus dat moet in elk geval ook beschikbaar zijn (eventueel verborgen) in de lijst op de website.
De vlotste methode is vervolgens een XML file maken met je gegevens. Helaas weet ik niet hoe je dat doet vanuit je website, maar dat kunnen anderen je wel vertellen.
Je slaat de XML ergens in een temp folder op, in mijn voorbeeld is dat E:\Develop\SQL\data\CustList.xml
De voorbeeld XML die ik gebruikte ziet eruit als:

Code:
<?xml version="1.0" encoding="utf-8"?>
<Customers>
  <Customer>
    <CID>1</CID>
    <Name>Name1</Name>
    <active>1</active>
  </Customer>
  <Customer>
    <CID>2</CID>
    <Name>Name2</Name>
    <active>0</active>
  </Customer>
  <Customer>
    <CID>6</CID>
    <Name>Name3</Name>
    <active>1</active>
  </Customer>
</Customers>
in mijn database (SQL server) TSQL_NGA heb ik een tabel Customers:

Code:
CREATE TABLE [dbo].[Customers](
	[custid] [int] IDENTITY(1,1) NOT NULL,
	[companyname] [nvarchar](40) NOT NULL,
	[contactname] [nvarchar](30) NOT NULL,
	[contacttitle] [nvarchar](30) NOT NULL,
	[address] [nvarchar](60) NOT NULL,
	[city] [nvarchar](15) NOT NULL,
	[region] [nvarchar](15) NULL,
	[postalcode] [nvarchar](10) NULL,
	[country] [nvarchar](15) NOT NULL,
	[phone] [nvarchar](24) NOT NULL,
	[fax] [nvarchar](24) NULL,
	[active] [bit] NULL,
 CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED 
(
	[custid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

Vervolgens heb ik de volgende procedure gemaakt die de gegevens uit de XML importeert:

Code:
USE [TSQL_NGA]
GO
/****** Object:  StoredProcedure [dbo].[p_test]    Script Date: 16/03/2023 18:06:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		NGA
-- Create date: 16/3/2023
-- Description:	Use XML as list to update table
-- =============================================
CREATE PROCEDURE [dbo].[p_test] 
	
AS
BEGIN
	
	SET NOCOUNT ON;

  
	CREATE TABLE #MyCustomers
    (
        mcCustID INT,
        mcCompany nVARCHAR(40),
        mtActive bit
    );
       
INSERT INTO #MyCustomers (mcCustID, mcCompany, mtActive)
SELECT
   MY_XML.Customer.query('CID').value('.', 'INT'),
   MY_XML.Customer.query('Name').value('.', 'VARCHAR(40)'),
   MY_XML.Customer.query('active').value('.', 'bit')

FROM (SELECT CAST(MY_XML AS xml)
      FROM OPENROWSET(BULK 'E:\Develop\SQL\data\CustList.xml', SINGLE_BLOB) AS T(MY_XML)) AS T(MY_XML)
      CROSS APPLY MY_XML.nodes('Customers/Customer') AS MY_XML (Customer);

--select * from  #MyCustomers
update Customers set active = mtactive
from Customers C inner join #MyCustomers MC on  c.custid =  MC.mcCustID 
	 
drop table  #MyCustomers

END

Ik hoop dat dit je een beetje op weg kan helpen
 
Eerst en vooral zou ik niet de link op name leggen, maar op het ID veld
Ik vermoed dat hier een onduidelijkheid is tussen db ontwerp en website ontwerp. Op een website wordt bij de html code <inpput type="...." name="..."> voor name meestal een toepasselijke aanduiding gekozen, bijvoorbeeld name="voornaam" als een voornaam ingevuld moet worden.

Je slaat de XML ergens in een temp folder op, in mijn voorbeeld is dat E:\Develop\SQL\data\CustList.xm
Een browser (frontend) kan niet bij dit XML bestand (in de backend), gelukkig maar ivm veiligheid ;)
 
In het grijze verleden heb ik ook wel eens een website ontworpen, en daar kon ik toen de ID meegeven in de code die aan de basis van de getoonde lijst zat zonder die te tonen. Ik vermoed dat dit nog kan.

Voor de duidelijkheid: de XML opslaan is om het voorbeeld uit te proberen. Je kan dat ook opslaan in een XML kolom van de database. Maar ik zou het eerst al eens uittesten op de database voor je iets dergelijks in de website doet.
 
daar kon ik toen de ID meegeven in de code die aan de basis van de getoonde lijst zat zonder die te tonen.
Ah, nu begrijp ik wat je bedoelt met id. Dat is een verwijzing naar de style (de vormgeving) van de pagina. De id moet binnen 1 webpagina uniek zijn én moet met een letter beginnen. Ook kan de id worden gebruikt om in JavaScript (in de browser) meer functionaliteit te geven aan de webpagina, vandaar dat de id met een letter moet beginnen.

Je kan dat ook opslaan in een XML kolom van de database.
TS vraagt min of meer naar de weergave van een lijst op de webpagina, niet in de db.
Het gaat dan alleen om ASP, HTML en CSS. Werk aan de db is volgens mij niet nodig.
 
Ik ben bang dat we de TS gaan verwarren: ik heb het wel degelijk over de ID in de database tabel. Aangezien je de database moet gaan updaten heb je die echt wel nodig om de juiste record te gaan updaten, met een naam ben je niet veel. En als je gegevens die je op de website publiceert in de DB wil laten aanpassen, één per één of alles in één keer moet je wel degelijk 'werk' op de database doen.
 
NoellaG schrijft
Code:
één per één of alles in één keer moet je wel degelijk 'werk' op de database doen.

Het meest logische m.i. zou zijn alles in een keer updaten

Bron schrijft
Code:
TS vraagt min of meer naar de weergave van een lijst op de webpagina, niet in de db.
Het gaat dan alleen om ASP, HTML en CSS. Werk aan de db is volgens mij niet nodig.

Dit gaat inderdaad alleen om ASP, HTML, Acces database en CSS (nog te weinig)

Misschien was mijn probleemomschrijving toch niet zo duidelijk - ik probeer het nogmaals

1. Uit een Access database worden volgende elementen opgehaald naar form
- tbl0 : naam persoon
- tbl1 : de activiteiten = veld ID1 (in tbl2 is niet elke persoon voor elke activiteit aanwezig)
- tbl2 : veld ID2 (recordnr) + veld met aanwezig / afwezig + veld met naamverwijzing naar tbl0 - dit veld is vooraf als aanwezig ingevuld
2. door het formulier wordt op het scherm de naam weergegeven met ernaast de <select 'Aanwezig' en 'Afwezig' option>. Als uit de databasetabel 'Aanwezig' komt, kan dat dus hier veranderd worden in 'Afwezig' of omgekeerd.
3. einde van het form is de inputregel die het al dan niet gewijzigd (aanwezig)veld via een action "post" naar de update query doorstuurt
Tbl 2 wordt dus onmiddellijk geüpdatet (de data in deze tabel(len) worden daarna gebruikt voor gebruikslijsten)

Dit is hoe mijn systeem voor één persoon per doorloop perfect werkt : ophalen uit de database => eventueel wijzigen => terug naar de database voor (later) gebruik.

In mijn topic wil ik die ene persoon vervangen door een groep => de operator en te wijzigen persoon zijn in dit geval niet dezelfde (vandaar dat ik hierboven pro memorie tbl0 schreef)

Wat is nu verschillend tussen mijn werkende module voor het updaten met 1 persoon versus het updaten van de groep
Door het form in te sluiten in een <Do While> voor alle personen/namen (uit tbl 0) die beantwoorden aan de juiste activiteit (=tbl 1), krijg ik de namen (zoals hierboven onder punt 2) op het scherm onder elkaar met naast elke naam zijn of haar aanwezigheidsaanduiding zoals die opgehaald is uit tbl 2. (=de koppeling tussen naam en aanwezigheid).l
Helemaal onderaan dit form verschijnt dan de inputregel (dus niet na elke naam - wat ook kan)
<td><input type="submit" name="Submit" value="Gegevens bevestigen"></td></tr>

Na de reacties en suggesties is mijn probleem m.i. te omschrijven als hoe kan ik de toestand na de doorloop van het formulier ineens updaten naar tbl 2
=> vermoedelijk moet daarvoor aan de inputregel hierboven gesleuteld worden
=> hoe kan [naam1 mét de aanwezigheid van naam 1] tot bijvoorbeeld [naam 50 met de aanwezigheid van naam 50] - zoals die door het formulier onder elkaar (ter update) getoond wordt - gecodeerd worden naar een update query waarmee tbl 2 ineens wordt geüpdatet. Daarbij zou m.i. géén tussentijdse tabel moeten gecreëerd worden.

Is dat mogelijk ?
Dank voor tips.
 
Laatst bewerkt:
Hoi Leifoet,
als met een SQL server zou werken, is het te doen. Maar met een Access database weet ik het niet. Misschien de vraag naar het access forum verplaatsen?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan