[gelöst] Komplizierte SQL-Anweisung als CVS exportieren
Eingetragen von Ati (210)
am 05.03.2012 - 09:25 Uhr in
am 05.03.2012 - 09:25 Uhr in
Hallo zusammen,
ich steh mal wieder etwas auf dem Schlauch. Ich muss das Ergebnis der beiliegenden SQL-Anweisung als CSV-Datei exportieren.
Aktuell habe ich noch nicht so recht den Durchblick wie ich das schaffen kann. Hier mal die SQL-Anweisung.
$sqlexport ="SELECT kundennr_lgort.numkreis,kd_liefnr.kd_liefnr,tagesprotokoll.artikel,
kd_eigene_art.kd_art_nr,tagesprotokoll.mc1,NULL,NULL,kundennr_lgort.lagerort,NULL,
tagesprotokoll.menge,tagesprotokoll.au,'|'
FROM tagesprotokoll
LEFT JOIN kd_eigene_art ON
tagesprotokoll.artikel = kd_eigene_art.artikel
AND tagesprotokoll.kdnr = kd_eigene_art.kunde
LEFT JOIN kd_liefnr ON
tagesprotokoll.kdnr = kd_liefnr.kdnr
LEFT JOIN kundennr_lgort ON
tagesprotokoll.stichwort = kundennr_lgort.lagerort
AND tagesprotokoll.kdnr = kundennr_lgort.kunde
WHERE au IN (".$in_klausel."); ";
Gruß
Ati
- Anmelden oder Registrieren um Kommentare zu schreiben
Einfachste Lösung ohne
am 05.03.2012 - 12:32 Uhr
Einfachste Lösung ohne Drupal:
* phpMyAdmin starten
* Query unter "SQL" eingeben
* Auf "Exportieren" klicken und csv wählen ...
Alternativ gibt es Drupal Module die Du anpassen kannst, Deiner Frage scheint allerdings weniger mit Drupal zu tun zu haben. Falls doch schau mal hier:
https://drupal.org/project/profile_csv
https://drupal.org/project/views_data_export
https://drupal.org/project/views_bonus
Ähm der Export sollte schon
am 05.03.2012 - 12:35 Uhr
Ähm der Export sollte schon aus dem Drupal heraus erfolgen. Werde mir Deine Links mal anschauen.
Ich bin nicht doof....ich denk nur anders
Hmm steh immer noch da wie
am 05.03.2012 - 14:46 Uhr
Hmm steh immer noch da wie ein Ochs vorm Berg. Vielleicht sollte ich mal schildern was für ein wildes Ding ich hier vorhabe.
Ein Kunde von uns hätte gerne alle gelieferten Positionen einer Woche (geht um 2 verschiedene Werke) jeweils eine CSV-Datei.
In dieser CSV-Datei sollen 11 verschiedene Felder sein und abschliessend ein "|". Diese Informationen muss ich nun aus drei
verschiedenen Tabellen rausholen. Der Erste Schritt ist bereits getan...ich habe ein View erstellt, wo man anhand des Stichwortes
(entsprechende Werk) die erste Selektion machen kann. Auf diese Basis muss ich jetzt die anderen Informationen aus dem Originalpost
dazu packen und dieses Ergebnis dann als CSV exportieren.
Ati
Ich bin nicht doof....ich denk nur anders
Kannst Du dazu einen View
am 18.03.2012 - 00:50 Uhr
Kannst Du dazu einen View basteln, mit Du Dein Ergebnis bekommst, oder muß es Deine eigene Abfrage sein? Einen View kannst Du als CSV ausgeben lassen (gibt es ein Modul dazu).
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Moin Werner, wie Du anhand
am 18.03.2012 - 09:52 Uhr
Moin Werner,
wie Du anhand des ersten Posts lesen kannst benötige ich Daten aus drei verschiedenen Tabellen die als csv-Datei exportiert werden müssen.
Dies habe ich mit einem View nicht hinbekommen. Ich dache ich könnte was über Realationships machen nur wenn
ich eine Beziehung einrichten will, will Firefox sowie InternetExplorer plötzlich eine Datei downloaden..kann also über das UI keine Relationships einrichten.
Das csv-Modul für views kenne ich und nutze es auch schon für andere Sachen.
Ich bin nicht doof....ich denk nur anders
Das Problem
am 18.03.2012 - 11:22 Uhr
besteht wahrscheinlich darin, dass Drupal die Tabellen nicht kennt und auch nicht selber pflegt.
An Drupal vorbei zu programmieren, ist keine gute Idee, auch wenn es zunächst einfacher aussieht.
Grüße
Ronald
Hallo Ati, wenn Du die
am 18.03.2012 - 11:38 Uhr
Hallo Ati,
wenn Du die Datenbankapplikation selbst geschrieben hättest, wurde ich sagen, schönes SQL-Statement (nur die NULL Werte haben, nach meinem Verständnis, im SEELCT nicht zu suchen). Dummerweise liegt Drupal dazwischen und die Daten liegen vermutlich so nicht in der Datenbank, da Drupal die Felder anders speichert.
Um auf der Metaebene (Tabelle = Datentyp) Joins zu definieren mußt Du sie mittels [do:references References] definieren und bereits beim Erstellen der Datensätze diese Referenzen setzen. Dann kannst Du diese Referenzen im View als Relationship benutzen und so Deine Abfrage zusammenbauen.
Ich fürchte, Du mußt Dich noch mal mit Deiner Datenstruktur intensiver befassen, damit Du Deine Idee in Drupal umgesetzt bekommst.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Nun Gott sei Dank kommt etwas
am 18.03.2012 - 11:55 Uhr
Nun Gott sei Dank kommt etwas Bewegung in diesen Thread..so das ich doch mal andere Ansätze höre.
@Ronald...jetzt wo Du es sagst sollte ich nochmal prüfen ob ich die Tabellen nur importiert habe oder ob ich sie in Drupal auch verfügbar gemacht habe.
@wla... nun zu diesem SQL-Export muss ich dann jetzt dochmal was genauer erklären. Ein Kunde von uns möchte am Montag per CSV alle gelieferten
Positionen haben. Die Felder hat er vorgegeben (deshalb auch null-felder dabei). Die Unterscheidung der einzelnen Abteilung erfolgen über das Stichwort.
Auf Basis des Stichwortes wird die interne Abteilungsnummer des Kunden gezogen (1. Tabelle). Des weiteren hat er für unsere Artikel bei sich eigene Artikelnummern.
Hier gilt es eben unsere Artikelnummer und seine Artikelnummer anzuzeigen (2.Tabelle). Die Haupttabelle sind natürlich alle Auftragspositionen der letzten Woche.
@all...ist es schonmal jemandem passiert das der Firefox eine Datei zum Download anbietet wenn man eine Relationship erstellen will?
Ich bin nicht doof....ich denk nur anders
Wenn Du diese Tabellen selber
am 18.03.2012 - 12:16 Uhr
Wenn Du diese Tabellen selber gebaut hast und die so vorliegen, dann mußt Du die CSV-Datei in einem eigenen Modul selbst schreiben, was ja kein großer Akt ist, wenn man mit PHP umgehen kann. Den Aufruf der Export-Funktion könnte über einen Menü-Callback (hook_menu benutzen) erfolgen, den der Kunde sogar selbst anstoßen könnte (ausreichende Excection-Time mal vorausgesetzt). Ich bin immer noch der Meinung, daß die NULL im SELECT-Statement nichts zu suchen hat. Die leeren Felder mußt Du dann in der Export-Funktion einsetzen.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Zu dem Entschluß das komplett
am 18.03.2012 - 12:40 Uhr
Zu dem Entschluß das komplett selber zu machen bin ich gestern abend gekommen. Deswegen hatte
ich auch diesen Thread gestartet http://www.drupalcenter.de/node/40516 .
Ich bin nicht doof....ich denk nur anders
Da hast Du aber den falschen
am 18.03.2012 - 12:50 Uhr
Da hast Du aber den falschen Ansatz gewählt. Du erstellst die Datei auf dem Server und zeigst einen Link auf die Datei, damit man darüber die Datei herunterladen kann. Du könntest auch einen entsprechenden Datentyp anlegen. Dann legst Du per Programm einen entsprechenden Node an, in dem Du den Pfad einträgst. Diese Nodes kannst Du dann über Views anzeigen.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Also da ich ja einfach
am 18.03.2012 - 13:02 Uhr
Also da ich ja einfach getsrickt bin ;-) wollte ich das analog zu der existierenden Lösung machen.
$sqlexport ="SELECT busch_lgort.numkreis,kd_liefnr.kd_liefnr,tagesprotokoll.artikel,
kd_eigene_art.kd_art_nr,tagesprotokoll.mc1,NULL,NULL,busch_lgort.lagerort,NULL,
tagesprotokoll.menge,tagesprotokoll.au,'|'
FROM tagesprotokoll
LEFT JOIN kd_eigene_art ON
tagesprotokoll.artikel = kd_eigene_art.artikel
AND tagesprotokoll.kdnr = kd_eigene_art.kunde
LEFT JOIN kd_liefnr ON
tagesprotokoll.kdnr = kd_liefnr.kdnr
LEFT JOIN busch_lgort ON
tagesprotokoll.stichwort = busch_lgort.lagerort
AND tagesprotokoll.kdnr = busch_lgort.kunde
WHERE au IN (".$in_klausel."); ";
$file = 'busch_'.date("dmY_Hi").'.csv';
header("Content-Type: text/csv");
header("Content-Disposition: attachment; filename=\"$file\"");
$ergebnis=mysql_query($sqlexport);
while($row = mysql_fetch_row($ergebnis)) {
print implode(';', $row)."\n";}
Wie gesagt das ist der Code der aktuellen Lösung. Wie lautet die mysql_fetch_row-Variante unter Drupal?
@wla hast Du für Deinen Ansatz mal ein Beispiel welches ich mir anschauen kann...habe da ein kleines Problem das nachzuvollziehen was Du da geschrieben hast.
Ich bin nicht doof....ich denk nur anders
@Werner Ich glaube ich habe
am 18.03.2012 - 15:45 Uhr
@Werner
Ich glaube ich habe den ersten Teil hinbekommen....der Link fehlt noch. Hier mal der aktuelle Code:
function buschcsv_my_form_submit($form, &$form_state) {
$kw = $form_state['values']['kw'];
$stw = $form_state['values']['stichwort'];
$sql="SELECT busch_lgort.numkreis,kd_liefnr.kd_liefnr,tagesprotokolle.artikel,
kd_eigene_art.kd_art_nr,tagesprotokolle.mc1,NULL,NULL,busch_lgort.lagerort,NULL,
tagesprotokolle.menge,tagesprotokolle.au,'|'
FROM tagesprotokolle
LEFT JOIN kd_eigene_art ON
tagesprotokolle.artikel = kd_eigene_art.artikel
AND tagesprotokolle.kdnr = kd_eigene_art.kunde
LEFT JOIN kd_liefnr ON
tagesprotokolle.kdnr = kd_liefnr.kdnr
LEFT JOIN busch_lgort ON
tagesprotokolle.stichwort = busch_lgort.lagerort
AND tagesprotokolle.kdnr = busch_lgort.kunde
WHERE tagesprotokolle.stichwort = '".$stw."' AND tagesprotokolle.kw ='".$kw."'";
$file = 'sites/busch_'.date("dmY_Hi").'.csv';
//drupal_set_header("Content-Type: text/csv");
//drupal_set_header("Content-Disposition: attachment; filename=\"$file\"");
$result = db_query($sql);
$fp = fopen($file, 'w');
while ($row = $result->fetchAssoc()) {
fputcsv($fp, $row,';')."\n";}
fclose($fp);
drupal_set_message('Datei wurde erstellt');
}
Oder habe ich Dich falsch verstanden??
Ati
Ich bin nicht doof....ich denk nur anders
Bis hier sieht das gut aus.
am 18.03.2012 - 16:10 Uhr
Bis hier sieht das gut aus. Jetzt einen Node vom Type Doewnload-File anlegen (den Datentyp mußt Du erst definieren) und den Code (das Setzen des Typs nicht vergessen) so schreiben, wie es beim Beispiel von [api:node_object_prepare:7] (unten auf der Seite) zu sehen ist.
Jetzt hast Du einen Node in Drupal erstellt, den Du z.B. mit Views anzeigen kannst.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Hm...versuche mal zu
am 18.03.2012 - 17:35 Uhr
Hm...versuche mal zu verstehen was Du meinst ;-)
Ich bin nicht doof....ich denk nur anders
Hm...versuche mal zu
am 18.03.2012 - 17:35 Uhr
Hm...versuche mal zu verstehen was Du meinst ;-)
Ich bin nicht doof....ich denk nur anders
So ich habe jetzt mal einen
am 19.03.2012 - 10:54 Uhr
So ich habe jetzt mal einen Inhaltstyp download_file angelegt welcher nur aus Title,Path und eben der Datei besteht.
Das Datei-Feld hat den Namen field_csvdatei. Ich kann jetzt per Programm zwar einen Node erstellen aber eben nciht
inkl. Datei..hier mache ich wohl was gravierendes falsch. Anbei mal der aktuelle Code
$file = 'sites/default/files/busch_'.date("dmY_Hi").'.csv';
$filename = 'busch_'.date("dmY_Hi").'.csv';
$result = db_query($sql);
$fp = fopen($file, 'w');
while ($row = $result->fetchAssoc()) {
fputcsv($fp, $row,';')."\n";}
fclose($fp);
$node = new stdClass();
$node->type = 'download_file';
node_object_prepare($node);
$node->title = $filename;
$node->language = LANGUAGE_NONE;
$node->field_csvfile = $file;
$path = 'content/' . $filename;
$node->path = array('alias' => $path);
node_save($node);
Gruß
Ati
Ich bin nicht doof....ich denk nur anders
Wenn Du den Node-Typ
am 19.03.2012 - 11:28 Uhr
Wenn Du den Node-Typ definiert hast, einmal einen Testnode anlegen, den mittels node_load(ID) in einer Testfunktion laden und dann mit print_r ausgeben. Jetzt hast Du die genaue Struktur für diesen Typ und brauchst den nur noch entsprechend befüllen. Sieh mal in anderen Modulen nach, aber um eine Datei in Drupal einzutragen muß ein Eintrag in der files-Tabelle gemacht werden und auf die dabei verwendete fid wird im Node referenziert.
Wie Du einen File bei Drupal anlegst, um die fid zu bekommen, findest Du unter api.drupal.org/api/drupal/includes!file.inc/group/file/7. Dort stehen die Felder des File-Objects und mit der Funktion file_save bringst Du den File in die Drupal Struktur. Ich habe jetzt ca. 10 Minuten gesucht, bis ich diese Information gefunden hatte. Ich habe das nämlich auch noch nicht per Programm gemacht und war neugierig.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Ich hatte mal was nach diesem
am 19.03.2012 - 11:35 Uhr
Ich hatte mal was nach diesem Link versucht http://www.comm-press.de/en/node/843 ... wie man sich denken kann ohne Erfolg.
Ich bin nicht doof....ich denk nur anders
Das sieht aber ordentlich
am 19.03.2012 - 11:48 Uhr
Das sieht aber ordentlich aus. Einzig bei der NodeID im Comment-Setting ist ein Fehler, da die NodeID aus dem gerade gesichterten Node zu nehmen wäre
$comment = (object) array(
'nid' => $node->nid,
'cid' => 0,
. . . . . .
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Das ist aber doch der Comment
am 19.03.2012 - 11:53 Uhr
Das ist aber doch der Comment Bereich oder? Ich hatte mich hier nur auf den File-Part konzentriert.
Ich bin nicht doof....ich denk nur anders
Ja, das bezieht sich nur auf
am 19.03.2012 - 12:01 Uhr
Ja, das bezieht sich nur auf Comments.
Zu dem File-Bereich gibt bei den Kommentaren unter dem Blogeintrag noch einen Hinweis, wie man es besser (oder richtiger) machen sollte. Ich würde das mit den dort genannte Funktionen noch mal probieren. Das sieht ziemlich gut aus, auch wenn ich das selbst noch nicht gemacht habe.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
So folgender Code läuft ohne
am 19.03.2012 - 12:39 Uhr
So folgender Code läuft ohne Fehler durch und die Datei wird auch verschoben und auch in der Tabelle file_managed geschrieben
$node = new stdClass();
$node->type = 'download_file';
node_object_prepare($node);
$node->title = $filename;
$node->language = LANGUAGE_NONE;
$filepath = drupal_realpath($filecsv);
// Create managed File object and associate with Image field.
$file = (object) array(
'uid' => 1,
'filename' => $filecsv,
'uri' => $filepath,
'filemime' => file_get_mimetype($filepath),
'status' => 1,
);
$file = file_move($file, 'public://');
$path = 'content/' . $filename;
$node->path = array('alias' => $path);
node_save($node);
Was noch fehlt ist das man die Datei downloaden kann wenn man den Node aufruft....es erscheint immer noch der Node ohne Datei.
Wenn ich den Node mit Devel öffne gibt es für field_csvfile keine Einträge..nur ein leeres Array.
Ich bin nicht doof....ich denk nur anders
Es ist vollbracht!!! Hier mal
am 19.03.2012 - 13:59 Uhr
Es ist vollbracht!!! Hier mal der Quellcode
$filecsv = 'busch_'.date("dmY_Hi").'.csv';
$filename = 'busch_'.date("dmY_Hi");
$result = db_query($sql);
$fp = fopen($filecsv, 'w');
while ($row = $result->fetchAssoc()) {
fputcsv($fp, $row,';')."\n";}
fclose($fp);
$node = new stdClass();
$node->type = 'download_file';
node_object_prepare($node);
$node->title = $filename;
$node->language = LANGUAGE_NONE;
$filepath = drupal_realpath($filecsv);
// Create managed File object and associate with Image field.
$file = (object) array(
'uid' => 1,
'display' => 1,
'filename' => $filename,
'uri' => $filepath,
'filemime' => file_get_mimetype($filepath),
'status' => 1,
);
$file = file_move($file, 'public://');
$node->field_csvfile[LANGUAGE_NONE][0] = (array)$file;
$path = 'content/' . $filename;
$node->path = array('alias' => $path);
node_save($node);
drupal_set_message('Datei wurde erstellt');
@Werner...Danke Dir!!!
Ati
Ich bin nicht doof....ich denk nur anders