Inlägg

Inlägg som RobinJacobsson har skrivit i forumet
Av RobinJacobsson
Skrivet av sebbeharry:

Titta på andra svaret i den här tråden på stackoverflow. Tror det kan hjälpa dig en hel del. Du väljer range på cellerna du vill ha från din excel-fil och den genererar ett script med den datan som du sen kör i mysql-databasen. Hur du sen vill visa ut det hela med hjälp av php är ett senare steg tänker jag. Det här är absolut inte en lösning rätt av men kan vara en spark i rätt riktning.

https://stackoverflow.com/questions/1310166/how-to-import-an-...

Problemet är att denna filen exporteras med ganska jämna mellanrum. Jag behöver en lösning som automatiskt läser av en filväg, låt säga C:\Excel.xlsx som jag ersätter frekvent med samma namn.

Jag hittade en modul som kallas Spout, som möjliggör PHP att läsa .xlsx.

$path = 'data/Excel.xlsx'; # open the file $reader = ReaderEntityFactory::createXLSXReader(); $reader->open($path); # read each cell of each row of each sheet foreach ($reader->getSheetIterator() as $sheet) { foreach ($sheet->getRowIterator() as $row) { foreach ($row->getCells() as $cell) { var_dump($cell->getValue()); } } } $reader->close();

Vad jag behöver hjälp med är hur koden ska se ut för att hitta och identifiera de rader, och endast utvinna data ur dom rader jag visar i dokumentet.

Av RobinJacobsson

Sortera och överföra data .xlsx och MySQL

Hej,

Jag exporterar en .xlsx fil från Visma med varierande antal rader, och skulle vilja få ut Ordernummer samt Leveransdatum till egna rader i MySQL så att jag kan presentera datan på en websida med hjälp av PHP.

Finns det någon som kan hjälpa mig att konvertera datan till MySQL som jag beskriver till höger i bilden med hjälp av PHP? Tack.

Av RobinJacobsson

Visma Administration 2000

Hej,

Jag frågar här eftersom det verkar omöjligt att få ett enkelt svar från Visma's support. Dom hänvisar till sin egen FAQ vilket är det första man får upp om man googlar. Jag får känslan av att dom vill att man ska köpa deras utbildningspaket.

Jag har en artikel upplagd. När jag går till flik #2 (lager) så vill jag kunna sätta/se ett lagersaldo. Den är gråmarkerad och går ej att redigera. När jag går till inventering för att inventera upp artikeln så sker ingen förändring i lagersaldot.

Hur gör jag för att sätta ett lagersaldo på en artikel? Och hur får jag den att ge heads-up när jag lägger in artikeln i en order, så att jag ser att det finns ett lagersaldo på den/vilken lagerposition den skall hämta saldo från?

Tack för hjälpen.

Av RobinJacobsson

Vilket program för att redigera musikvideo?

Hej,

Vilket program rekommenderar ni för redigering av en musikvideo? Vi tänkte testa börja göra det själva mest för att det kan vara roligt, och skulle föredra en gratis/billig mjukvara om det finns att hitta.

Av RobinJacobsson
Skrivet av Hattifnatten:

Nu kommer det bli ärligt och rakt. 4/5 poäng, inte min genre men låter överlag trevligt.

Vid 1:16 är det en obehaglig "spike" med effekter. Oklart. Inte lika illa 2:13, men kan nog poleras. Ibland är det dialekt i engelskan, ibland inte. Antar att saxofonen är gjord med midiklaviatur? Vid exakt 2:55 låter som om någon har slajdat över tangenter snarare än en saxofon.

Inget större att anmärka på mixen. Låter bra i Genelec.

Tack för all feedback (och komplimanger). Du menar rev-svansen på "go"? Vi fick kritik på den, och sänkte den ganska mycket från första mixen.

Det är Chris Cron som sjunger.
https://youtu.be/DNL6Wy6IstE

Vore förvånad om det är dåligt/varierat uttal då han är från USA 😂 jag lägger inte så stor vikt vid text och uttal dock, men jag själv har inte anmärkt på det.

Och saxen är inspelad av en studiomusiker från Stockholm.

Det är mixat i Adam A7x och referenslyssning i lurar.

Av RobinJacobsson

Släppt en ny låt, önskar kritik!

Hej,

https://open.spotify.com/track/0Z0hje0Ftd1ODN4bWuecNB?si=bafa...

Vi har precis släppt en låt, vi vill kategorisera oss inom Synthwave men det har kanske ett lite mer popigt sound. Vi ska snart släppa låt #3 och det vore kul att höra vad ni tycker om låt/sounddesign/mix/text osv som vi kan ta med oss in i nästa låt.

Av RobinJacobsson
Skrivet av orig_rejser:

Vill du vara lat kan du köra en nästlad
if(D6='A', Formel1(), if(D6='B', Formel2(),if(D6='C',Formel3(),''))) typ

Fast det är en väldigt ful lösning. Switch är bättre

Blev lite förvånad att det inte går att skriva en IF som i tex PHP:

If($1 == '1') { }elseif($2 == '2') { }elseif($3 == '3'){ }

Av RobinJacobsson
Skrivet av sworst:

Jag tror det blir enklare om du använder SWITCH.
Här är en länk som förklarar.
https://support.microsoft.com/en-au/office/switch-function-47ab33c0-28ce-4530-8a45-d532ec4aa25e

Istället för att returnera veckodagar som i exemplet borde det gå att returnera de olika formlerna.
Har inte provat själv.

Switch fungerade. Tack!

Av RobinJacobsson

Excel IF/OR (OM/ELLER)

Hej,

Jag undrar hur jag sätter upp detta villkoret i Excel. När jag googlar så hittar jag bara OM(ELLER(villkor)sant, falskt).

Jag vill göra följande:
Om D6 = "A" kör formel1()
Om D6 = "B" kör formel2()
Om D6 = "C" kör formel3()

Tack

Av RobinJacobsson
Skrivet av WebbkodsLärlingen:

Menar du alltså vid SELECT-frågan där du vill att när ett nytt datum eller nytt materialtyp visas (jämfört med föregående rad) så ska det fetmarkeras så man kan se vilka som verkar höra ihop med samma datum och/eller materialtyp?

$sql2 = "SELECT * FROM xml ORDER BY DeliveryPeriod, SupplierPartNumber"; $result2 = mysqli_query($conn, $sql2); // First declare variables to compare against for every row // First row will have nothing to compare against so it should check it is also empty. $prevPartNumber = ""; $prevDeliveryPeriod = ""; while ($row = mysqli_fetch_assoc($result2)) { echo "Artikel: " . $row['PartNumber']. "<br>"; // Previous row for Part Number is NOT empty and NOT the same? if($prevPartNumber != "" && $row['SupplierPartNumber'] != $prevPartNumber){ echo "<strong>Material: </strong>"; } else { echo "Material: ";} echo $row['SupplierPartNumber'] . "<br>"; // Store current row to act as previous row during next iteration $prevPartNumber = $row['SupplierPartNumber']; echo $row['SupplierPartNumber'] . "<br>"; // Previous row for Delivery Period is NOT empty and NOT the same? if($prevPartDeliveryPeriod != "" && $row['DeliveryPeriod'] != $prevDeliveryPeriod){ echo "<strong>Leveransdatum: </strong>"; } else { echo "Leveransdatum: ";} // Store current row to act as previous row during next iteration $prevDeliveryPeriod = $row['DeliveryPeriod']; echo $row['DeliveryPeriod'] . "<br> Antal: " . $row['Quantity'] . "<br><br>"; }

Mvh,
WKL.

Ja, när materialtyp eller datum ändras i listan så vill jag ha en visuell indikation på att en förändring har skett.
Tog några screenshots på hur jag menar.

https://ibb.co/wytxH9B
https://ibb.co/ZctGMKY

Av RobinJacobsson
Skrivet av WebbkodsLärlingen:

Jag är rätt säker på att så länge du vet att $description alltid är numerisk datatyp så kan du "läs-förenkla" SQL-frågan och skippa concate. Om du vill stoppa in flera gånger vid DB-anropet så använd multi_query där du bygger ihop en lång sträng som innehåller flera SQL-frågor i följd.

<?php // $conn need to have been defined here (or included 'db.php') before running the code below // Declare empty string to add SQL Queries to. $sql = ""; // Now loop through data that will add SQL Queries to $sql foreach ($xml->children() as $order) { foreach ($order->Rows->children() as $row) { $title = $row->Part['PartNumber']; $link = $row->Part['SupplierPartNumber']; $description = $row->Quantity; $keywords = $row->DeliveryPeriod; echo("Artikel: ".$title." Material: ". $link." Antal: ". $description." Datum: ". $keywords."<br>"); // SQL Injections + XSS Protection mysqli_real_escape_string($conn, strip_tags($title)); mysqli_real_escape_string($conn, strip_tags($tlink)); mysqli_real_escape_string($conn, strip_tags($description)); mysqli_real_escape_string($conn, strip_tags($keywords)); // Add SQL Query to $sql $sql .= "INSERT INTO xml(PartNumber,SupplierPartNumber,Quantity,DeliveryPeriod) VALUES ('$title','$link',$description,'$keywords'); "; }} // Now make multi query with longest $sql string in the world $result = mysqli_multi_query($conn, $sql); if (! empty($result)) { $affectedRow ++; } else { $error_message = mysqli_error($conn) . "\n"; } ?>

Jag hoppas att mitt första läsår som nu snart kommer till sitt slut kan göra någon riktiga nytta online för allra första gången!

Mvh,
WKL.

Vi verkar prata olika språk men jag kan utvinna lite svenska mellan raderna
Ska kolla närmre på detta imorgon. Det är dock inga stora mängder data/rader i SQL, vad jag behöver lösa nu är en visuell tydlighet där ett nytt datum - $row['DeliveryPeriod'] eller materialtyp - $row['SupplierPartNumber'] presenteras med en border eller bold text, dvs om det förändras mot förra cykeln i loopen enligt mitt förra inlägg. Vore som sagt väldigt tacksam om någon ville hjälpa mig med en smidig/snygg lösning där.

Av RobinJacobsson
Skrivet av nimbus:

Det funkar nog så länge det inte är enorma datamängder. Men rekommenderar dig att kolla på prepared statements (https://www.php.net/manual/en/mysqli.quickstart.prepared-stat...).

Tusen tack för din hjälp, nu fungerar det som jag vill.

En sista sak jag tänkte på, jag skulle nog föredra en markering (fet stil, eller en border) när datum eller artikel ändras. Eller en dubbel radbrytning.
Jag tänker att man kanske kan sätta en variabel i loopen som jämför föregående data med nästa datarad, och om $ett != $två så infogar man en sådan markering. Är det rätt tänkt? Vore tacksam om någon som har koll vill bidra med kod, annars får jag göra ett försök imorgon

Dvs längst ner i koden där datan presenteras och där någon av nedanstående variablers data varierar. Jag sorterar ju i SQL-query'n efter den datan.
$row['SupplierPartNumber']
$row['DeliveryPeriod']

$data = "data.xml"; $xml = simplexml_load_file($data) or die("Error: Cannot create object"); foreach ($xml->children() as $order) { foreach ($order->Rows->children() as $row) { $title = $row->Part['PartNumber']; $link = $row->Part['SupplierPartNumber']; $description = $row->Quantity; $keywords = $row->DeliveryPeriod; echo("Artikel: ".$title." Material: ". $link." Antal: ". $description." Datum: ". $keywords."<br>"); $sql = "INSERT INTO xml(PartNumber, SupplierPartNumber, Quantity, DeliveryPeriod) VALUES ('" . $title . "','" . $link . "','" . $description . "','" . $keywords . "')"; $result = mysqli_query($conn, $sql); if (! empty($result)) { $affectedRow ++; } else { $error_message = mysqli_error($conn) . "\n"; } }} ?> <center><h2>Företagsnamnet</h2></center> <center><h1>XML Data storing in MySQL Database</h1></center> <?php if ($affectedRow > 0) { $message = $affectedRow . " records inserted"; } else { $message = "No records inserted"; } $sql2 = "SELECT * FROM xml ORDER BY DeliveryPeriod, SupplierPartNumber"; $result2 = mysqli_query($conn, $sql2); while ($row = mysqli_fetch_assoc($result2)) { echo "Artikel: " . $row['PartNumber'] . "<br> Material: " . $row['SupplierPartNumber'] . "<br> Leveransdatum: " . $row['DeliveryPeriod']."<br> Antal: ".$row['Quantity']."<br><br>"; } ?>

Av RobinJacobsson
Skrivet av nimbus:

Byt ut den där foreach:en mot det jag skickade tidigare, med nästlade foreach (en för varje order, och inuti en för varje rad) så funkar det om filen är korrekt.

Jaha, jag provade den koden förut utan att det funkade. Nu lade jag in den igen och vips så fungerar det.

Dock så uppstår ett nytt problem när jag ska lägga in det i MySQL, den verkar bara ta sista värdet och lägga in. Är det en rimligt lösning att göra ett SQL-anrop varje gång i loopen och fylla databasen på så vis?

Otestad kod, men jag menar ungefär såhär:

foreach ($xml->children() as $order) { foreach ($order->Rows->children() as $row) { $title = $row->Part['PartNumber']; $link = $row->Part['SupplierPartNumber']; $description = $row->Quantity; $keywords = $row->DeliveryPeriod; echo("$title, $link, $description, $keywords\n<br>"); // SQL query to insert data into xml table $sql = "INSERT INTO xml(PartNumber, SupplierPartNumber, Quantity, DeliveryPeriod) VALUES ('" . $title . "','" . $link . "','" . $description . "','" . $keywords . "')"; $result = mysqli_query($conn, $sql); }

Av RobinJacobsson
Skrivet av nimbus:

Filen är valid om varje start-element har ett motsvarande slut-element (alternativ ett självavslutande element, t.ex. <Foo />). Men att ha ett start-element <Order> och sen ingen matchande </Order> som stänger segmentet är inte rätt.

I mitt exempel använde jag bara en metod för simplexml som tar en sträng istället för fil. Det kvittar vilket man använder. Men återigen så måste innehållet i XML-dokumentet vara korrekt när den parsas på det sättet. Annars vet inte parsern när en Order avslutas och en ny kommer.

Okej, jo men dom finns där. Så utgå från att filen är korrekt. Då undrar jag varför den inte hämtar någon data med denna koden?

$data = "data.xml"; // Load xml file else check connection $xml = simplexml_load_file($data) or die("Error: Cannot create object"); // Assign values foreach ($xml->children() as $row) { $title = $row->Part['PartNumber']; $link = $row->Part['SupplierPartNumber']; $description = $row->Quantity; $keywords = $row->DeliveryPeriod;

Det fungerar som sagt när jag tar bort alla andra taggar och bara kör <Rows><Row>

Av RobinJacobsson
Skrivet av nimbus:

Du kommer aldrig att kunna parsa den där XML-filen med en trädbaserad parser som simplexml eftersom den är invalid. När du tar bort taggar ovanför som Order och ORDERS420 så gör du den valid igen. Det första borde vara att försöka få tillgång till en valid XML-fil, dvs åtgärda grundproblemet. Ett alternativ kan vara att läsa in filen, modifiera den innan du sen försöker parsa den genom att lägga till taggar som saknas. Ett annat alternativ kan vara att använda en event-baserad/streamande parser istället, men det är mer krångligt att implementera.

Ursäkta om jag är otydlig nu. Filen är "valid" om jag förstår dig rätt, dom taggarna finns i slutet, jag har bara tagit bort en massa <Row> taggar för att minska mängden text här i forumet, då har dom antagligen hängt med oavsiktligt.

Men även om jag lägger in dom taggarna så lyckas jag inte få ut den datan jag behöver, med den koden jag har bifogat.
Och ditt exempel kräver ju att jag lägger in PHP-kod i XML-filen, vilket jag tyvärr inte kan göra.

Av RobinJacobsson
Skrivet av nimbus:

Jag korrigerade XML-koden eftersom den var invalid för att vara XML, lade bara till slut-taggarna som saknades:

</Order> </ORDERS420>

Om du inte har möjlighet att korrigera XML-koden blir det svårt att parsa ordentligt med den parser du använder.

Okej,

Såhär är det: Jag har en .xml fil som byts ut varje dag. Den går inte att ändra.
Sedan har jag en index.php där jag kör min PHP-kod, och jag måste kunna läsa från min data.xml därifrån.

Men jag tycker det är konstigt, det fungerar ju som sagt när jag tar bort alla taggar ovanför, det verkar vara något med hur den laddar in taggarna att göra. Gissningsvis children() funktionen eller något i närheten.

Av RobinJacobsson
Skrivet av nimbus:

Inte jobbat med PHP sedan länge, men kanske något liknande detta kan leda dig på rätt väg i XML-parsningen:

<?php $xmlString = <<<XML <?xml version="1.0" encoding="utf-8"?> <ORDERS420 SoftwareManufacturer="" SoftwareName="MONITOR" SoftwareVersion="23.4.3.22198"> <Order OrderNumber="83"> <Head> <Supplier SupplierCodeEdi="77"> <Name></Name> <StreetBox1></StreetBox1> <StreetBox2></StreetBox2> <ZipCity1></ZipCity1> <ZipCity2 /> <Country>Sverige</Country> </Supplier> <Buyer BuyerCodeEdi="13"> <Name></Name> <StreetBox1></StreetBox1> <StreetBox2 /><ZipCity1></ZipCity1><ZipCity2 /><Country></Country></Buyer><References><BuyerReference></BuyerReference><BuyerComment /><GoodsLabeling><Row1 /><Row2 /></GoodsLabeling></References><DeliveryAddress><Name></Name><StreetBox1></StreetBox1><StreetBox2 /><ZipCity1></ZipCity1><ZipCity2 /><Country>Sverige</Country><CompanyAdressFlag>1</CompanyAdressFlag></DeliveryAddress><Terms><DeliveryTerms><IncoTermCombiTerm> </IncoTermCombiTerm><DeliveryMethod>Ändra leveranssätt</DeliveryMethod><TransportPayer>C</TransportPayer><CustomerTransportTimeDays>0</CustomerTransportTimeDays></DeliveryTerms><CustomerInvoiceCode>183</CustomerInvoiceCode><OrderDate>2023-06-14</OrderDate><PaymentTerms><TermsOfPaymentDays>30</TermsOfPaymentDays></PaymentTerms></Terms><Export><Currency>SEK</Currency></Export></Head> <Rows> <Row RowNumber="10" RowType="1"> <Part PartNumber="007-7212-0" SupplierPartNumber="BET3" /> <Text>TEXT, LÅDA</Text> <ReferenceNumber /> <Quantity>20.00</Quantity> <Unit>st</Unit> <DeliveryPeriod>2023-06-20</DeliveryPeriod> <Each>24.00</Each> <Discount>0.00</Discount> <Setup /> <Alloy>0.00</Alloy> </Row> <Row RowNumber="20" RowType="1"> <Part PartNumber="004-7212-0" SupplierPartNumber="BET3" /> <Text>LÅDA</Text> <ReferenceNumber /> <Quantity>30.00</Quantity> <Unit>st</Unit> <DeliveryPeriod>2023-06-21</DeliveryPeriod> <Each>24.00</Each> <Discount>0.00</Discount> <Setup /> <Alloy>0.00</Alloy> </Row> </Rows> </Order> </ORDERS420> XML; $xml = simplexml_load_string($xmlString); foreach ($xml->children() as $order) { foreach ($order->Rows->children() as $row) { $title = $row->Part['PartNumber']; $link = $row->Part['SupplierPartNumber']; $description = $row->Quantity; $keywords = $row->DeliveryPeriod; echo("$title, $link, $description, $keywords\n"); } }

Tack, men jag får det inte att fungera. Detta verkar bygga på en lösning där du modifierat XML-koden, vilket jag inte kan göra.
Vore väldigt tacksam om någon ville hjälpa mig att lösa detta!

Av RobinJacobsson
Skrivet av snajk:

Ofta kan man väl importera XML direkt in i en DB? Jag har gjort det för XML och många andra filformat (Excel, CSV, och så vidare) direkt mot SQL Server med SSMS. Har man den väl i en db kan man ju meka med den hur mycket man vill sen.

Det är så jag gjort. Laddar in det i SQL och lyckas sortera det rätt. Det funkar när jag kör en XML-fil med bara <rows> och <row> men så fort jag lägger till alla taggar ovanför i koden nedan så slutar den läsa in till databasen. Kan någon tala om vad jag gör för fel i min PHP-kod? Jag antar att det har med children() att göra..?

PHP

foreach ($xml->children() as $row) { $title = $row->Part['PartNumber']; $link = $row->Part['SupplierPartNumber']; $description = $row->Quantity; $keywords = $row->DeliveryPeriod;

XML

<?xml version="1.0" encoding="utf-8"?> <ORDERS420 SoftwareManufacturer="" SoftwareName="MONITOR" SoftwareVersion="23.4.3.22198"> <Order OrderNumber="83"> <Head> <Supplier SupplierCodeEdi="77"> <Name></Name> <StreetBox1></StreetBox1> <StreetBox2></StreetBox2> <ZipCity1></ZipCity1> <ZipCity2 /> <Country>Sverige</Country> </Supplier> <Buyer BuyerCodeEdi="13"> <Name></Name> <StreetBox1></StreetBox1> <StreetBox2 /><ZipCity1></ZipCity1><ZipCity2 /><Country></Country></Buyer><References><BuyerReference></BuyerReference><BuyerComment /><GoodsLabeling><Row1 /><Row2 /></GoodsLabeling></References><DeliveryAddress><Name></Name><StreetBox1></StreetBox1><StreetBox2 /><ZipCity1></ZipCity1><ZipCity2 /><Country>Sverige</Country><CompanyAdressFlag>1</CompanyAdressFlag></DeliveryAddress><Terms><DeliveryTerms><IncoTermCombiTerm> </IncoTermCombiTerm><DeliveryMethod>Ändra leveranssätt</DeliveryMethod><TransportPayer>C</TransportPayer><CustomerTransportTimeDays>0</CustomerTransportTimeDays></DeliveryTerms><CustomerInvoiceCode>183</CustomerInvoiceCode><OrderDate>2023-06-14</OrderDate><PaymentTerms><TermsOfPaymentDays>30</TermsOfPaymentDays></PaymentTerms></Terms><Export><Currency>SEK</Currency></Export></Head> <Rows> <Row RowNumber="10" RowType="1"> <Part PartNumber="007-7212-0" SupplierPartNumber="BET3" /> <Text>TEXT, LÅDA</Text> <ReferenceNumber /> <Quantity>20.00</Quantity> <Unit>st</Unit> <DeliveryPeriod>2023-06-20</DeliveryPeriod> <Each>24.00</Each> <Discount>0.00</Discount> <Setup /> <Alloy>0.00</Alloy> </Row> <Row RowNumber="20" RowType="1"> <Part PartNumber="004-7212-0" SupplierPartNumber="BET3" /> <Text>LÅDA</Text> <ReferenceNumber /> <Quantity>30.00</Quantity> <Unit>st</Unit> <DeliveryPeriod>2023-06-21</DeliveryPeriod> <Each>24.00</Each> <Discount>0.00</Discount> <Setup /> <Alloy>0.00</Alloy> </Row> </Rows>

Av RobinJacobsson

Nu har jag lyckats konvertera allt till SQL och sorterar i hämtningen.

Men jag lyckas däremot inte få ut PartNumber och SupplierPartNumber ur denna raden. Antar att det har något att göra med att det ligger innanför taggen. XML-filen måste vara i det formatet som den är, så jag måste lösa det i andra änden. Vore tacksam för hjälp.

PHP

foreach ($xml->children() as $row) { $title = $row->PartNumber; $link = $row->SupplierPartNumber; $description = $row->Quantity; $keywords = $row->DeliveryPeriod;

XML

<Row RowNumber="20" RowType="1"> <Part PartNumber="078-10218" SupplierPartNumber="35515" /> <Text /> <ReferenceNumber /> <Quantity>15.00</Quantity> <Unit>st</Unit> <DeliveryPeriod>2023-06-29</DeliveryPeriod> <Each>120.00</Each> <Discount>0.00</Discount> <Setup /> <Alloy>0.00</Alloy> </Row>

Av RobinJacobsson

-