{"id":260,"date":"2015-09-29T21:25:18","date_gmt":"2015-09-29T19:25:18","guid":{"rendered":"https:\/\/moijari.com\/?p=260"},"modified":"2015-09-30T17:44:51","modified_gmt":"2015-09-30T15:44:51","slug":"html-asiakas","status":"publish","type":"post","link":"https:\/\/moijari.com\/?p=260","title":{"rendered":"HTML asiakas"},"content":{"rendered":"<p>Sain valmiiksi uuden version k\u00e4ytt\u00f6liittym\u00e4st\u00e4. Rutiini on aika pitk\u00e4, joten ajattelin k\u00e4yd\u00e4 sen l\u00e4pi v\u00e4h\u00e4n yksityiskohtaisemmin kuin edelliset koodinp\u00e4tk\u00e4t.<\/p>\n<p>Kaikki oikeudet tietenkin pid\u00e4tet\u00e4\u00e4n. Viimeinen versio ohjelmasta l\u00f6ytyy seuraavasta linkist\u00e4: <a href=\"https:\/\/moijari.com:5002\">moijari.com:5002<\/a><\/p>\n<p>Linkiss\u00e4 on muuten t\u00e4m\u00e4 uusi versio, toivotaan, ettei se kaatuile&#8230; Linkiss\u00e4 on edellisen postin sis\u00e4\u00e4n lokkaantuminen. Anna k\u00e4ytt\u00e4j\u00e4tunnukseksi testi ja salasanaksi testaus.<\/p>\n<p>Edit: Lis\u00e4tty save nappula jatkon tekstiin ja koodiin. Lis\u00e4tty loppuun otsakkeen ja rivien tulostusrutiinit.<\/p>\n<p>Rutiini k\u00e4y l\u00e4pi seuraavat vaiheet<\/p>\n<ul>\n<li>nappuloiden k\u00e4sittely<\/li>\n<li>HTML otsakkeen tulostus (HTTP\/1.0, Location, Server, Date jne.)<\/li>\n<li>terttu sanan valikon tulostus<\/li>\n<li>yl\u00e4rivin nappuloiden tulostus<\/li>\n<li>vierasavainten k\u00e4sittely (aiemmassa postissa)<\/li>\n<li>Save nappulan rutiini<\/li>\n<li>otsakeiden kenttien luku tertusta<\/li>\n<li>rivien kenttien tietojen luku tertusta<\/li>\n<li>Fetch nappulan k\u00e4sittely ensimm\u00e4inen k\u00e4sittely<\/li>\n<li>Prev ja Next nappuloiden endimm\u00e4inen k\u00e4sittely<\/li>\n<li>Submit, Display, Change ja Save nappuloiden k\u00e4sittely<\/li>\n<li>Fetch, Prev ja Next nappuloiden toinen yhteinen osa<\/li>\n<li>tulosta otsake<\/li>\n<li>tulosta rivit<\/li>\n<li>vapauta k\u00e4ytetyt muistialueet.<\/li>\n<\/ul>\n<p>Koodissa on v\u00e4h\u00e4n enemm\u00e4n kommentteja kun tavallisesti. Ohjelman viimeinen versio linkki toimii taas. Vierasavainten k\u00e4sittelypostissa mainitut muutokset l\u00f6ytyy kappaleessa eiv\u00e4t ole viel\u00e4 paikallaan.<\/p>\n<pre>void html_sovellus(char *sovellus)\r\n{\r\n\u00a0 int comp;\r\n\u00a0 char temps[512];\r\n\u00a0 unsigned char *criteria;\r\n\r\n\u00a0 unsigned char *bonesheaderdata,*bonesheaderdatacriteria;\r\n\u00a0 unsigned char *boneslinesdata,*boneslinesdatacriteria;\r\n\u00a0 unsigned char *memberid[64];\r\n\u00a0 unsigned char timebuf[128];\r\n\u00a0 unsigned char *ucp;\r\n\u00a0 time_t now;\r\n\r\n\u00a0 struct set *setheaderfields, *sethf;\r\n\u00a0 struct set *setlinesfields, *setlf;\r\n\u00a0 struct set *setheaderdata, *sethd;\r\n\u00a0 struct set *setscreendata, *setsd;\r\n\u00a0 struct set *setlinesdata, *setld;\r\n\u00a0 struct set *setprev,*setnext;\r\n\r\n\u00a0 bonesheaderdatacriteria=NULL;\r\n\u00a0 boneslinesdatacriteria=NULL;\r\n\u00a0 setheaderfields=NULL, sethf=NULL;\r\n\u00a0 setlinesfields=NULL, setlf=NULL;\r\n\u00a0 setheaderdata=NULL, sethd=NULL;\r\n\u00a0 setscreendata=NULL, setsd=NULL,\r\n\u00a0 setlinesdata=NULL, setld=NULL;\r\n\u00a0 setprev=NULL,setnext=NULL;\r\n\r\n\u00a0 *func='\\0';\r\n\r\n  ; luetaan parametreist\u00e4 func parametri\r\n\u00a0 set_get_element(\"func\",&amp;comp,func,htmlparams);\r\n\r\n\u00a0 if(*func=='\\0') {\r\n\u00a0\u00a0\u00a0 strcpy(func,\"\");\r\n\u00a0 }\r\n\r\n\u00a0 if(!strcmp(func,\"Terttu\"))\r\n\u00a0\u00a0\u00a0 strcpy(func,\"\");\r\n  ; Nappuloiden k\u00e4sittely\r\n\r\n\u00a0 if(!exists_session_var(\"mode\"))\r\n\u00a0\u00a0\u00a0 strcpy(mode,\"Display\");\r\n\u00a0 else {\r\n\u00a0\u00a0\u00a0 ucp=NULL;\r\n\u00a0\u00a0\u00a0 get_session_var(\"mode\",&amp;ucp);\r\n\u00a0\u00a0\u00a0 strcpy(mode,ucp);\r\n\u00a0 }\r\n\r\n  ; Func kent\u00e4ss\u00e4 on yl\u00e4rivin nappulan toiminnon nimi\r\n  ; (Fetch, Prev, Next, Display, Change, Save jne.)\r\n  ; Mode kent\u00e4n mukaan otsakkeen ja rivien tulostuksessa\r\n  ; tulostetaan vain katselu(Display) tai muuttelu(Change)\r\n  ; kentti\u00e4. Lis\u00e4ksi mode vaikuttaa siihen tulostetaanko\r\n  ; rivit lohkoon ylim\u00e4\u00e4r\u00e4isi\u00e4 rivej\u00e4 rivien lis\u00e4yst\u00e4\r\n  ; varten.\r\n  ;\r\n  ; Suomeksi:\r\n  ;\r\n  ; Fetch, Prev ja Next nappulat antavat katselun\u00e4yt\u00f6n,\r\n  ; muuttaaksesi tietoja voit painaa Change nappulaa.\r\n  ;\r\n  ; Submit, Reset ja Save eiv\u00e4t vaikuta n\u00e4ytt\u00f6muotoon,\r\n  ; eli jos olit ennen nappulaa muuttamassa, n\u00e4ytt\u00f6\r\n  ; s\u00e4ilyy muutosmoodissa, jos olit display moodissa,\r\n  ; n\u00e4ytt\u00f6 s\u00e4ilyy muuttelumoodissa.\r\n  ;\r\n  ; Display ja change nappulat vaikuttavat vain\r\n  ; n\u00e4ytt\u00f6tilaan (katselu, muutos).\r\n  ;\r\n  ; Fetch, Prev ja Next nappulat lukevat tietoja\r\n  ; tertusta. Ja muuttavat n\u00e4ytt\u00f6tilaksi katselutilan\r\n  ;\r\n  ; Save nappula kutsuu skk_save rutiinia, joka lis\u00e4\u00e4\r\n  ; nappulan lokin loppuun(nyt). Muut rutiinin\r\n  ; teht\u00e4v\u00e4t on viel\u00e4 auki \r\n  ;\r\n\u00a0 if(!strcmp(func,\"Fetch\")) {\r\n\u00a0\u00a0\u00a0 strcpy(mode,\"Display\");\r\n\u00a0 } else if(!strcmp(func,\"Prev\") ) {\r\n\u00a0\u00a0\u00a0 strcpy(mode,\"Display\");\r\n\u00a0 } else if(!strcmp(func,\"Next\") ) {\r\n\u00a0\u00a0\u00a0 strcpy(mode,\"Display\");\r\n\u00a0 } else if(!strcmp(func,\"Submit\")) {\r\n\u00a0\u00a0\u00a0 \/* ei vaikuta modeen *\/\r\n\u00a0 } else if(!strcmp(func,\"Reset\")) {\r\n\u00a0 } else if(!strcmp(func,\"Display\") ) {\r\n\u00a0\u00a0\u00a0 strcpy(mode,\"Display\");\r\n\u00a0 } else if(!strcmp(func,\"Change\")) {\r\n\u00a0\u00a0\u00a0 strcpy(mode,\"Change\");\r\n\u00a0 } else if(!strcmp(func,\"Save\")) {\r\n    \/* Save ei vaikuta n\u00e4ytt\u00f6\u00f6n *\/     \r\n\u00a0 }\r\n\r\n\u00a0 if(mode==NULL) {\r\n\u00a0\u00a0\u00a0 strcpy(mode,\"Display\");\r\n\u00a0\u00a0\u00a0 set_session_var(\"mode\",mode);\r\n\u00a0 } else \r\n\u00a0\u00a0\u00a0 set_session_var(\"mode\",mode);\r\n\r\n  ; Tulostetaan html otsake. Html otsakkeessa\r\n  ; ensimm\u00e4isess\u00e4 osassa on html:n rivien lukum\u00e4\u00e4r\u00e4.\r\n  ; T\u00e4m\u00e4n takia ensimm\u00e4inen ja toinen osa tulostetaan\r\n  ; erikseen (html1 ja html2 muuttujat). html_printf\r\n  ; l\u00f6ytyy aiemmasta postista.\r\n\r\n\u00a0 html=html1;\r\n\u00a0 html[0]='\\0';\r\n\r\n\u00a0 html_printf(\"HTTP\/1.0 200 OK\\r\\n\");\r\n\u00a0 html_printf(\"Location: \\r\\n\");\r\n\u00a0 html_printf(\"Server: %s\\r\\n\",programname);\r\n\u00a0 now = time(NULL);\r\n\u00a0 strftime(timebuf, sizeof(timebuf), HTMLTIMEFORMAT, gmtime(&amp;now));\r\n\r\n\u00a0 html_printf(\"Date: %s\\r\\n\",timebuf);\r\n\r\n\u00a0 html=html2;\r\n\u00a0 html[0]='\\0';\r\n\u00a0 html_printf(\"\\n&lt;!DOCTYPE html&gt;\\r\\n\");\r\n\u00a0 html_printf(\"&lt;html lang=\\\"fi\\\"&gt;\");\r\n\r\n\u00a0 html_printf(\"&lt;head&gt;\");\r\n\u00a0 html_printf(\"&lt;meta charset=\\\"UTF-8\\\"&gt;\");\r\n\u00a0 html_printf(\"&lt;title&gt;Terttu&lt;\/title&gt;\",clientname);\r\n\u00a0 html_printf(\"&lt;meta name=\\\"author\\\" content=\\\"Jari Kuivaniemi\\\"&gt;\");\r\n\u00a0 html_printf(\"&lt;link href=\\\"terttu.css\\\" rel=\\\"stylesheet\\\" type=\\\"text\/css\\\"&gt;\");\r\n#ifdef OLD1\r\n\u00a0 html_printf(\"&lt;meta http-equiv=\\\"Content-Type\\\" content=\\\"text\/html; charset=\\\"UTF-8\\\"&gt;\");\r\n#endif\r\n\u00a0 html_printf(\"&lt;\/head&gt;\");\r\n\u00a0 html_printf(\"&lt;body&gt;\");\r\n\u00a0 html_printf(\"&lt;form action=\\\"%s\\\" method=\\\"post\\\"&gt;\",sovellus);\r\n\u00a0 html_printf(\"&lt;input type=\\\"hidden\\\" name=\\\"sessionid\\\" value=\\\"%s\\\"&gt;\",sessionid);\r\n\r\n\u00a0 html_printf(\"&lt;nav&gt;\");\r\n\u00a0 html_printf(\"&lt;ul&gt;\");\r\n\u00a0 html_printf(\"&lt;li&gt;Terttu\");\r\n\u00a0 html_printf(\"&lt;ul&gt;\");\r\n\r\n  ; Tulostaa terttu sanan valikon.\r\n\r\n\u00a0 html_sovellus_menu();\r\n\r\n\u00a0 html_printf(\"&lt;\/ul&gt;&lt;\/li&gt;\");\r\n\r\n  ; Tulostaa yl\u00e4rivin nappulat\r\n\r\n\u00a0 html_print_buttons();\r\n\r\n\u00a0 html_printf(\"&lt;\/ul&gt;\");\r\n\u00a0 html_printf(\"&lt;\/nav&gt;\");\r\n\r\n\u00a0 html_printf(\"&lt;table border=\\\"0\\\"&gt;\");\r\n\u00a0 html_printf(\"&lt;td&gt;\");\r\n\r\n  ; Selvitt\u00e4\u00e4 foreign key yhteydet ja t\u00e4ytt\u00e4\u00e4 kent\u00e4t.\r\n\u00a0 \r\n\u00a0 set_find_foreigns(sovellus,setscreen); \/* JariK 20150920 *\/\r\n\r\n  ; Save nappula suorittaa skk_save rutiinin. Lis\u00e4ksi\r\n  ; tarvitaan varmaankin tarkistuksia tiedoille (katso\r\n  ; set_find_foreigns \/ tietovirrat.\r\n  ;\r\n  ; Aluksi Save nappi kirjoittaa tietueet lokiin, jossa\r\n  ; sama tieto voi olla ajallisesti eri aikoina useampaan\r\n  ; kertaan. skk_fetch:st\u00e4 ilmeisesti tulee uusi versio,\r\n  ; joka lukee lokia. Ilmeisesti viimeisin versio valitaan\r\n  ; n\u00e4yt\u00f6lle. Jatkossa poimintaehdosta (esim\r\n  ; asiakasnumero=1000) voisi muodostaa tiiviste-\r\n  ; merkkijonon, jonka nimiseen tiedostoon kaikki\r\n  ; asiakasta tai muuta objektia koskevat tiedot\r\n  ; laitetaan. Asiakasluettelo (kaikki tietueet,\r\n  ; joissa on asiakasnumero kentt\u00e4) voisi olla\r\n  ; saatavilla pelk\u00e4st\u00e4 'asiakasnumero' tiivistettyn\u00e4\r\n  ; sanasta tehdyst\u00e4 tiedostosta.\r\n  ;\r\n\r\n  if(!strcmp(func,\"Save\")) {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 skk_save(setscreen);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0 }\r\n\u00a0 ; Haetaan otsakkeen kenttien nimet ja muodostetaan\r\n  ; otsakkeen hakuun k\u00e4ytett\u00e4v\u00e4 lause (bonesheaderdata)\r\n\r\n\u00a0 rowid=0;\r\n\r\n\u00a0 sprintf(temps,\"'sovellus'=\\\"%s\\\", 'chapter'=\\\"header\\\", 'memberid', 'memberlength'\",sovellus); \/* Added memberlength. JariK 20140209 *\/\r\n\r\n\u00a0 skk_fetch2(&amp;setheaderfields,temps,skk);\r\n\r\n\u00a0 bonesheaderdata=NULL;\r\n\r\n\u00a0 sethf=setheaderfields;\r\n\u00a0 while(sethf!=NULL) {\r\n\u00a0\u00a0\u00a0 set_get_element(\"memberid\",&amp;comp,memberid,sethf-&gt;data);\r\n\u00a0\u00a0\u00a0 set_add_element(&amp;bonesheaderdata,memberid); \/* Collect fieldnames to fieldsh *\/\r\n\u00a0\u00a0\u00a0 sethf=sethf-&gt;next;\r\n\u00a0 }\r\n\r\n  ; Haetaan rivikenttien nimet ja muodostetaan rividatan\r\n  ; hakuun tarvittava lause.\r\n<\/pre>\n<pre>\u00a0 sprintf(temps,\"'sovellus'=\\\"%s\\\", 'chapter'=\\\"lines\\\", 'memberid', 'memberlength'\",sovellus); \/* JariK 20140127 *\/\r\n\r\n\u00a0 skk_fetch3(&amp;setlinesfields,temps,skk); \/* Changed to version 2. JariK 20140214 to version 3. JariK 20140303 *\/\r\n\r\n\u00a0 boneslinesdata=NULL;\r\n\r\n\u00a0 setlf=setlinesfields; \/* sovellus, chapter=\"header\", memberid *\/\r\n\u00a0 while(setlf!=NULL) {\r\n\u00a0\u00a0\u00a0 set_get_element(\"memberid\",&amp;comp,memberid,setlf-&gt;data);\r\n\u00a0\u00a0\u00a0 set_add_element(&amp;boneslinesdata,memberid); \/* Collect fieldnames to fieldsh *\/\r\n\u00a0\u00a0\u00a0 setlf=setlf-&gt;next;\r\n\u00a0 }\r\n\r\n  ; T\u00e4m\u00e4 on fetch nappulan ensimm\u00e4inen vaihe. Fetch\r\n  ; nappula lukee n\u00e4yt\u00f6n otsakkeen kenttien arvot.\r\n  ;\r\n  ; Arvoja k\u00e4ytet\u00e4\u00e4n fetch, prev ja next nappuloiden\r\n  ; valikoimien otsaketietueiden valinnassa.\r\n  ; Fetch tallettaa kenttien arvot istuntomuuttujan\r\n  ; findmatch arvoksi.\r\n  ;\r\n  ; Lopuksi Fetchiss\u00e4 luetaan tuo otsakeketju ja\r\n  ; palautetaan ketjun ensimm\u00e4inen otsikko sethd\r\n  ; muuttujassa.\r\n\u00a0 if(!strcmp(func,\"Fetch\")) { \/* JariK 20140220 *\/\r\n\r\n\u00a0\u00a0\u00a0 setscreendata=NULL;\r\n\r\n\u00a0\u00a0\u00a0 \/* skkuser contains fields filled by user (see parameter reading)\r\n\u00a0\u00a0\u00a0\u00a0 * fieldsh contains names of header fields.\r\n\u00a0\u00a0\u00a0\u00a0 *\/\r\n\u00a0\u00a0\u00a0 skk_fetch_sets(&amp;setscreendata,bonesheaderdata,setscreen);\r\n\r\n\u00a0\u00a0\u00a0 setsd=setscreendata;\r\n\u00a0\u00a0\u00a0 criteria=NULL;\r\n\u00a0\u00a0\u00a0 while(setsd!=NULL) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 set_copy_filled(&amp;criteria,setsd-&gt;data);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 setsd=setsd-&gt;next;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 if(setscreendata!=NULL) \/* Free also. JariK 20140221 *\/\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 set_free(setscreendata);\r\n\u00a0\u00a0\u00a0 setscreendata=NULL;\r\n\r\n\u00a0\u00a0\u00a0 bonesheaderdatacriteria=NULL;\r\n\u00a0\u00a0\u00a0 set_copy_all(&amp;bonesheaderdatacriteria,criteria);\r\n\u00a0\u00a0\u00a0 set_copy_all(&amp;bonesheaderdatacriteria,bonesheaderdata);\r\n\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 set_session_var(\"findmatch\",bonesheaderdatacriteria);\r\n\r\n\u00a0\u00a0\u00a0 if(criteria!=NULL)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 free(criteria);\r\n\u00a0\u00a0\u00a0 criteria=NULL;\r\n\r\n\u00a0\u00a0\u00a0 setheaderdata=NULL;\r\n\u00a0\u00a0\u00a0 skk_fetch_sets(&amp;setheaderdata,bonesheaderdatacriteria,skk-&gt;first);\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 sethd=setheaderdata;\r\n\u00a0 }\r\n\r\n  ; Prev ja next nappulat lukevat n\u00e4yt\u00f6lt\u00e4 t\u00e4m\u00e4n hetkisen\r\n  ; otsake tietueen kent\u00e4t. Seuraavaksi hartaan Fetchin\r\n  ; saamat valintakriteerit findmatch ymp\u00e4rist\u00f6-\r\n  ; muuttujasta. Sitten luetaan valintakriteerien\r\n  ; mukaiset tiedot tertusta. Seuraavaksi \r\n\r\n\u00a0 if((!strcmp(func,\"Prev\") || \/* JariK 20140223 *\/\r\n\u00a0\u00a0\u00a0\u00a0 !strcmp(func,\"Next\")) &amp;&amp;\r\n\u00a0\u00a0\u00a0\u00a0 exists_session_var(\"findmatch\")) { \/* JariK 20140223 *\/\r\n\r\n\u00a0\u00a0\u00a0 skk_fetch_sets(&amp;setscreendata,bonesheaderdata,setscreen); \/* Ennen set_fetch. JariK 20150920 *\/\r\n\r\n\u00a0\u00a0\u00a0 setsd=setscreendata;\r\n\u00a0\u00a0\u00a0 criteria=NULL;\r\n\u00a0\u00a0\u00a0 while(setsd!=NULL) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 set_copy_filled(&amp;criteria,setsd-&gt;data);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 setsd=setsd-&gt;next;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 if(setsd!=NULL)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 set_free(setsd);\r\n\u00a0\u00a0\u00a0 setsd=NULL;\r\n\r\n\u00a0\u00a0\u00a0 \/* Luetaan fetchin tallettama kentt\u00e4, joka sis\u00e4lt\u00e4\u00e4\r\n     * otsakkeen kent\u00e4t fetchin painamisen ajalta.\r\n     * Esim selaa asiakkaan tilauksia jos asiakasnumero\r\n     * on t\u00e4ytetty.\r\n\u00a0\u00a0\u00a0\u00a0 *\/\r\n\u00a0\u00a0\u00a0 get_session_var(\"findmatch\",&amp;bonesheaderdatacriteria);\r\n\r\n\u00a0\u00a0\u00a0 setheaderdata=NULL;\r\n\u00a0\u00a0\u00a0 skk_fetch_sets(&amp;setheaderdata,bonesheaderdatacriteria,skk-&gt;first);\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 setnext=setheaderdata; \/* has next row. JariK 20140226 *\/\r\n\u00a0\u00a0\u00a0 sethd=NULL; \/* has new current row. JariK 20140226 *\/\r\n\u00a0\u00a0\u00a0 setprev=NULL; \/* has previous row. JariK 20140226 *\/\r\n\u00a0\u00a0\u00a0 \r\n    while(setnext!=NULL) {\r\n      ; Kun arvot m\u00e4ts\u00e4\u00e4v\u00e4t ruudulla prev tai next\r\n      ; nappulan painamisen aikana olleisiin tietoihin,\r\n      ; n\u00e4ytet\u00e4\u00e4n seuraavaksi joko t\u00e4t\u00e4 tietuetta edelt\u00e4v\u00e4\r\n      ; tai seuraava otsikko.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 if(!set_match2(setnext-&gt;data,criteria)) {\r\n\u00a0\u00a0 \u00a0    if(!strcmp(func,\"Prev\")) {\r\n\u00a0\u00a0 \u00a0\u00a0     if(setprev!=NULL) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0     sethd=setprev;\r\n\u00a0\u00a0 \u00a0\u00a0     } else {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0     sethd=setnext;\r\n\u00a0\u00a0 \u00a0\u00a0     }\r\n\u00a0\u00a0 \u00a0\u00a0     break;\r\n\u00a0\u00a0 \u00a0    } else if(!strcmp(func,\"Next\")) {\r\n\u00a0\u00a0 \u00a0\u00a0     if(setnext-&gt;next!=NULL) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0     sethd=setnext-&gt;next;\r\n\u00a0\u00a0 \u00a0\u00a0     } else {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0     sethd=setnext;\r\n          }\r\n\u00a0\u00a0 \u00a0\u00a0     break;\r\n        }\r\n\u00a0\u00a0 \u00a0  }\r\n  \u00a0\u00a0\u00a0 setprev=setnext;\r\n\u00a0\u00a0  \u00a0 setnext=setnext-&gt;next;\r\n\u00a0   }\r\n\u00a0\u00a0\u00a0 \/* Ei m\u00e4ts\u00e4\u00e4v\u00e4\u00e4 tietuetta, otetaan eka (esim fetch, reset, next) 20150929 JariK *\/\r\n\u00a0\u00a0\u00a0 if(sethd==NULL) \r\n\u00a0\u00a0\u00a0\u00a0\u00a0 sethd=setheaderdata;\r\n\u00a0 }\r\n\r\n  ; Submit, Change, Display ja Save nappuloilla luetaan\r\n  ; vain ruudulla olevat tiedot uudestaan\r\n  ; tulostettavaksi.\r\n\u00a0 if(!strcmp(func,\"Submit\") ||\r\n\u00a0\u00a0\u00a0\u00a0 !strcmp(func,\"Change\") ||\r\n\u00a0\u00a0\u00a0\u00a0 !strcmp(func,\"Display\") ||\r\n     !strcmp(func,\"Save\") ) {\r\n\r\n\u00a0\u00a0\u00a0 setheaderdata=NULL;\r\n\u00a0\u00a0\u00a0 skk_fetch_sets(&amp;setheaderdata,bonesheaderdata,setscreen);\r\n\r\n\u00a0\u00a0\u00a0 setlinesdata=NULL;\r\n\u00a0\u00a0\u00a0 skk_fetch_sets(&amp;setlinesdata,boneslinesdata,setscreen);\r\n\r\n\u00a0\u00a0\u00a0 setld=setlinesdata;\r\n\u00a0 }\r\n\r\n\u00a0 if(!strcmp(func,\"Fetch\") ||\r\n\u00a0\u00a0\u00a0\u00a0 !strcmp(func,\"Prev\") ||\r\n\u00a0\u00a0\u00a0\u00a0 !strcmp(func,\"Next\")) {\r\n\u00a0\u00a0\u00a0 boneslinesdatacriteria=NULL;\r\n\u00a0\u00a0\u00a0 if(sethd!=NULL)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 set_copy_all(&amp;boneslinesdatacriteria,sethd-&gt;data);\r\n\u00a0\u00a0\u00a0 set_copy_all(&amp;boneslinesdatacriteria,boneslinesdata);\r\n\r\n\u00a0\u00a0\u00a0 setlinesdata=NULL;\r\n\u00a0\u00a0\u00a0 skk_fetch_sets(&amp;setlinesdata,boneslinesdatacriteria,skk-&gt;first);\r\n\r\n\u00a0\u00a0\u00a0 setld=setlinesdata;\r\n\u00a0 }\r\n\r\n\u00a0 sethf=setheaderfields; \/* sovellus, chapter=\"header\", memberid *\/\r\n\r\n\u00a0 if(setheaderfields!=NULL)\r\n\u00a0\u00a0\u00a0 html_print_header(sethd,setheaderfields,mode); \/* Ennen sethd-&gt;data *\/\r\n\r\n\u00a0 setlf=setlinesfields; \/* sovellus, chapter=\"lines\", memberid *\/\r\n\u00a0 setld=setlinesdata;\r\n\r\n\u00a0 html_print_lines(setld, setlinesfields,mode);\r\n\r\n\u00a0 html_printf(\"&lt;\/td&gt;\");\r\n\u00a0 html_printf(\"&lt;\/tr&gt;\");\r\n\u00a0 html_printf(\"&lt;\/table&gt;\");\r\n\r\n\u00a0 set_debug_foreigns(sovellus,setscreen);\r\n\r\n\u00a0 html_printf(\"&lt;\/body&gt;\");\r\n\u00a0 html_printf(\"&lt;\/form&gt;\");\r\n\u00a0 html_printf(\"&lt;\/html&gt;\");\r\n\u00a0 html_printf(\"\\n\\n\");\r\n\r\n  ; Vapautetaan k\u00e4yt\u00f6ss\u00e4 olleet muistialueet\r\n\r\n\u00a0 if(bonesheaderdata!=NULL)\r\n\u00a0\u00a0\u00a0 free(bonesheaderdata);\r\n\u00a0 bonesheaderdata=NULL;\r\n\r\n\u00a0 if(bonesheaderdatacriteria!=NULL)\r\n\u00a0\u00a0\u00a0 free(bonesheaderdatacriteria);\r\n\u00a0 bonesheaderdatacriteria=NULL;\r\n\r\n\u00a0 if(setheaderfields!=NULL)\r\n\u00a0\u00a0\u00a0 set_free(setheaderfields);\r\n\u00a0 setheaderfields=NULL;\r\n\r\n\u00a0 if(setlinesfields!=NULL)\r\n\u00a0\u00a0\u00a0 set_free(setlinesfields);\r\n\u00a0 setlinesfields=NULL;\r\n\r\n\u00a0 if(setheaderdata!=NULL)\r\n\u00a0\u00a0\u00a0 set_free(setheaderdata);\r\n\u00a0 setheaderdata=NULL;\r\n\r\n\u00a0 if(setlinesdata!=NULL)\r\n\u00a0\u00a0\u00a0 set_free(setlinesdata);\r\n\u00a0 setlinesdata=NULL;\r\n}\r\n\r\nint html_print_header(struct set *set, struct set *setheaderfields,char *mode)\r\n{\r\n\u00a0 struct set *sethf;\r\n\r\n\u00a0 html_printf(\"&lt;div id=\\\"header\\\"&gt;\");\r\n\u00a0 html_printf(\"&lt;table border=\\\"0\\\"&gt;\");\r\n\u00a0 sethf=setheaderfields;\r\n\r\n  ; Tulostetaan kent\u00e4n nimi arvopareja kaikille\r\n  ; otsakkeen kentille.\r\n\r\n\u00a0 while(sethf!=NULL) {\r\n\u00a0\u00a0\u00a0 html_printf(\"&lt;tr&gt;\");\r\n\u00a0\u00a0\u00a0 html_printf(\"&lt;td&gt;\");\r\n\u00a0\u00a0\u00a0 html_print_fieldname(set,sethf-&gt;data,mode);\r\n\u00a0\u00a0\u00a0 html_printf(\"&lt;\/td&gt;&lt;td&gt;\");\r\n\u00a0\u00a0\u00a0 html_print_fieldvalue(set,sethf-&gt;data,mode);\r\n\u00a0\u00a0\u00a0 html_printf(\"&lt;\/td&gt;\");\r\n\u00a0\u00a0\u00a0 sethf=sethf-&gt;next;\r\n\u00a0\u00a0\u00a0 html_printf(\"&lt;\/tr&gt;\");\r\n\u00a0 }\r\n\u00a0 html_printf(\"&lt;\/table&gt;\");\r\n\u00a0 html_printf(\"&lt;\/div&gt;\");\r\n}\r\n\r\nint html_print_lines(struct set *setlinesdata, struct set *setlinesfields,char *mode)\r\n{\r\n\u00a0 int comp,lines;\r\n\u00a0 char memberid[64],memberlength[10],value[128];\r\n\u00a0 struct set *setlf;\r\n\u00a0 struct set *setld;\r\n\r\n\u00a0 html_printf(\"&lt;div id=\\\"lines\\\"&gt;\");\r\n\u00a0 html_printf(\"&lt;table border=\\\"0\\\"&gt;\");\r\n\u00a0 html_printf(\"&lt;tr&gt;\");\r\n\r\n  ; Tulostetaan kent\u00e4n nimet taulukon yl\u00e4riville.\r\n\r\n\u00a0 setlf=setlinesfields;\r\n\u00a0 while(setlf!=NULL) {\r\n\u00a0\u00a0\u00a0 set_get_element(\"memberid\",&amp;comp,memberid,setlf-&gt;data);\r\n\r\n\u00a0\u00a0\u00a0 html_printf(\"&lt;td&gt;\");\r\n\u00a0\u00a0\u00a0 html_printf(\"%s\",memberid); \/* Little bugfix JariK 31012014 *\/\r\n\u00a0\u00a0\u00a0 html_printf(\"&lt;\/td&gt;\");\r\n\u00a0\u00a0\u00a0 setlf=setlf-&gt;next;\r\n\u00a0 }\r\n\u00a0 html_printf(\"&lt;\/tr&gt;\");\r\n\r\n\u00a0 rowid++;\r\n\r\n\u00a0 lines=0;\r\n\r\n  ; Selataan rividata l\u00e4pi, ja kirjoitetaan yksi rivi\r\n  ; joka tietueelle.\r\n\r\n\u00a0 setld=setlinesdata;\r\n\u00a0 while(setld!=NULL) {\r\n\u00a0\u00a0\u00a0 html_printf(\"&lt;tr&gt;\");\r\n\r\n    ; Tulostetaan riville kaikki kent\u00e4t.\r\n\r\n\u00a0\u00a0\u00a0 setlf=setlinesfields;\r\n\u00a0\u00a0\u00a0 while(setlf!=NULL) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 set_get_element(\"memberid\",&amp;comp,memberid,setlf-&gt;data); \/* Get fieldname *\/\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 set_get_element(\"memberlength\",&amp;comp,memberlength,setlf-&gt;data);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 set_get_element(memberid,&amp;comp,value,setld-&gt;data); \/* Get data *\/\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 html_printf(\"&lt;td&gt;\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 html_printf(\"&lt;input type=\\\"text\\\" value=\\\"%s\\\" name=\\\"%s%c%d\\\" size=\\\"%s\\\"\u00a0 id=\\\"programbuttonlines\\\"\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value,memberid,rowidchar,rowid,memberlength);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 if(mode !=NULL &amp;&amp; !strcmp(mode,\"Display\"))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 html_printf(\" readonly\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 html_printf(\"&gt;\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value,memberid,rowidchar,rowid,memberlength);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 html_printf(\"&lt;\/td&gt;\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 setlf=setlf-&gt;next;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 html_printf(\"&lt;\/tr&gt;\");\r\n\r\n\u00a0\u00a0\u00a0 rowid++;\r\n\u00a0\u00a0\u00a0 lines++;\r\n\u00a0\u00a0\u00a0 setld=setld-&gt;next;\r\n\u00a0 }\r\n\r\n  ; Muuttelu tilassa tulostetaan tyhji\u00e4 rivej\u00e4, niin\r\n  ; ett\u00e4 kokonaisrivien m\u00e4\u00e4r\u00e4 on 10 (esim 1 t\u00e4ytetty\r\n  ; ja 9 tyhj\u00e4\u00e4. Yli kymmenen rivin tapahtumissa oli\r\n  ; ajatus ett\u00e4 tulostetaan vain yksi ylim\u00e4\u00e4r\u00e4inen\r\n  ; rivi. Kun se t\u00e4ytet\u00e4\u00e4n enter tuo uuden tyhj\u00e4n rivin.\r\n  ; sit\u00e4 ei ole t\u00e4ss\u00e4.\r\n\r\n\u00a0 if(mode!=NULL &amp;&amp; !strcmp(mode,\"Change\")) {\r\n\u00a0\u00a0\u00a0 while(lines&lt;10) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 html_printf(\"&lt;tr&gt;\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 setlf=setlinesfields;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 while(setlf!=NULL) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_get_element(\"memberid\",&amp;comp,memberid,setlf-&gt;data); \/* Get fieldname *\/\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_get_element(\"memberlength\",&amp;comp,memberlength,setlf-&gt;data);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 html_printf(\"&lt;td&gt;\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 html_printf(\"&lt;input type=\\\"text\\\" value=\\\"\\\" name=\\\"%s%c%d\\\" size=\\\"%s\\\"\u00a0 id=\\\"programbuttonlines\\\"&gt;\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 memberid,rowidchar,rowid,memberlength);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 html_printf(\"&lt;\/td&gt;\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 setlf=setlf-&gt;next;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 html_printf(\"&lt;\/tr&gt;\");\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 rowid++;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 lines++;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0 }\r\n}\r\n\r\nint html_print_fieldname(struct set *set, char *sethf,char *mode)\r\n{\r\n\u00a0 int comp;\r\n\u00a0 char memberid[64];\r\n\r\n  ; Tulostetaan kent\u00e4n nimi.\r\n\r\n\u00a0 set_get_element(\"memberid\",&amp;comp,memberid,sethf);\r\n\u00a0 html_printf(\"%s\",memberid);\r\n}\r\n\r\nint html_print_fieldvalue(struct set *set, char *setf,char *mode)\r\n{\r\n\u00a0 int comp;\r\n\u00a0 char memberid[64],memberlength[10],value[128];\r\n\r\n\u00a0 set_get_element(\"memberid\",&amp;comp,memberid,setf);\r\n\u00a0 set_get_element(\"memberlength\",&amp;comp,memberlength,setf);\r\n\r\n  ; Tulostetaan kent\u00e4n arvo. T\u00e4ss\u00e4 tehd\u00e4\u00e4n input lause\r\n  ; sy\u00f6tt\u00f6luukkua varten. Lis\u00e4ksi iffi n\u00e4ytt\u00f6kent\u00e4lle.\r\n\r\n\u00a0 *value='\\0';\r\n\u00a0 if(set!=NULL &amp;&amp; set-&gt;data!=NULL)\r\n\u00a0\u00a0\u00a0 set_get_element(memberid,&amp;comp,value,set-&gt;data); \/* Added data to header. JariK 20140216 *\/\r\n\u00a0 html_printf(\"&lt;input type=\\\"text\\\" value=\\\"%s\\\" name=\\\"%s%c%d\\\" size=\\\"%s\\\" id=\\\"programbuttonheader\\\"\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 value,memberid,rowidchar,rowid,memberlength);\r\n\u00a0 if(mode !=NULL &amp;&amp; !strcmp(mode,\"Display\"))\r\n\u00a0\u00a0\u00a0 html_printf(\" readonly\");\r\n\u00a0 html_printf(\"&gt;&lt;br&gt;\");\r\n}\r\n\r\n\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Sain valmiiksi uuden version k\u00e4ytt\u00f6liittym\u00e4st\u00e4. Rutiini on aika pitk\u00e4, joten ajattelin k\u00e4yd\u00e4 sen l\u00e4pi v\u00e4h\u00e4n yksityiskohtaisemmin kuin edelliset koodinp\u00e4tk\u00e4t. Kaikki oikeudet tietenkin pid\u00e4tet\u00e4\u00e4n. Viimeinen versio ohjelmasta l\u00f6ytyy seuraavasta linkist\u00e4: moijari.com:5002 Linkiss\u00e4 on muuten t\u00e4m\u00e4 uusi versio, toivotaan, ettei se kaatuile&#8230; Linkiss\u00e4 on edellisen postin sis\u00e4\u00e4n lokkaantuminen. Anna k\u00e4ytt\u00e4j\u00e4tunnukseksi testi ja salasanaksi testaus. Edit: Lis\u00e4tty save&hellip; <a class=\"more-link\" href=\"https:\/\/moijari.com\/?p=260\">Continue reading <span class=\"screen-reader-text\">HTML asiakas<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"_links":{"self":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/260"}],"collection":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=260"}],"version-history":[{"count":17,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/260\/revisions"}],"predecessor-version":[{"id":279,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/260\/revisions\/279"}],"wp:attachment":[{"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=260"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=260"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}