Import von Katalog

Begonnen von 1nelly1, März 23, 2011, 19:00:07

« vorheriges - nächstes »

0 Mitglieder und 1 Gast betrachten dieses Thema.

1nelly1

Hallo,

Problemstellung:
Eine Katalog-Textdatei, die auch benutzerdefinierte Datenfelder enthält, soll wiederkehrend automatisiert in den Shop eingelesen werden.

Erläuterung:
Für den in Shoppilot unterstützten Import einer CSV-Datei scheint es keinen Kommandozeilenbefehl zu geben. Ferner funktioniert der von Shoppilot bereitgestellte CSV-Import offenbar ohnehin nicht, wenn in der Datei benutzerdefinierte Felder vorhanden sind.
Obwohl es von Microsoft ODBC Text Treiber gibt, funktioniert bei mir der Import auf diesem Wege nicht. Die Felder der Textdatei werden zwar alle erkannt und können den Shoppilotfeldern zugeordnet werden, aber beim Starten kommt die Meldung "Das Datenbankmodul kann '' nicht finden". Mache ich etwas falsch oder geht das gar nicht auf diese Weise? Der Datenbankimport über Access (ODBC) funktioniert. Nur dann müsste man das Einlesen der Textdatei in Access automatisieren und dies auf der Kommandozeile starten können. Auf eine in Access angelegte Verknüpfung zu der Textdatei kann offenbar nicht per ODBC zugegriffen werden, d.h. die Textdatei muss also immer in Access importiert werden.

Ich wäre für Lösungsvorschläge dankbar.
Viele Grüße
1nelly1


dobra

Hallo 1nelly1,

wo kommt die csv-Datei her?

ich verwende ein pl Script, dass
1) eine csv vom Server lädt
3) eine verknüpfte Access-Tabellen-Abfrage bereitet die Daten auf
2) im Script definiert man das/die Importprofil/e  (beliebig viel)
4) das Script wird mit "geplantem Task" angestoßen

funktioniert also vollautomatisch

hier das Script (ist von ahe, nicht von mir  ;) )

use strict;
use Net::FTP;

my %config = (
    host => '<IP-Adresse>',
    user => 'xxx',
    pass => 'xxx',
    subdir => '',
    file => 'xxx.csv',
    shoppilot => 'C:\Programme\IBO-Internet-Software\ShopPilot-Enterprise3\bin\spilot.exe',
    projects => [
        { # Projekt 1 - Profil 1
            shoppilot_params => '/AutoDownload /AutoImportProfile "d:\projekt\test1.iprof" /AutoSave',
            shoppilot_projectfile => 'x:\xxx\xxx1.ist',
        },
        { # Projekt 1 - Profil 2
            shoppilot_params => '/AutoImportProfile "d:\projekt\test2.iprof" /AutoUpdate /AutoSave',
            shoppilot_projectfile => 'x:\xxx\xxx1.ist',
        },
        ## falls mehr gewünscht können hier dann noch beliebig viele weitere Projekte folgen...
    ],
);

## Herunterladen der CSV
if (1) {
    print "CSV-Datei wird heruntergeladen...\n";
    my $ftp = Net::FTP->new($config{host}); # Hier Deinen Host eingeben
    die "Konnte keine Verbindung aufbauen $!\n" unless $ftp;
    die "Login fehlgeschlagen!\n" if (!$ftp->login($config{user}, $config{pass}));
    if ($config{subdir}) {
        $ftp->cwd($config{subdir}); # cwd: Verzeichnis wechseln
    }
    $ftp->ascii();
    die "Herunterladen fehlgeschlagen!\n" unless $ftp->get($config{file});
    $ftp->quit;
}
   
## ShopPilot aktualisieren und veröffentlichen...
foreach my $project (@{$config{projects}}) {
    print "Shop '". $project->{shoppilot_projectfile} ."' wird aktualisiert...\n";
    #system('C:\Programme\---\bin\spilot.exe /option .. /option <.ist Datei>');
    system($config{shoppilot} . ' ' . $project->{shoppilot_params} . ' ' . $project->{shoppilot_projectfile});
    if ($? == -1) {
        print "failed to execute: $!\n";
    } elsif ($? & 127) {
        printf "child died with signal %d, %s coredump\n",
        ($? & 127),  ($? & 128) ? 'with' : 'without';
    } else {
        #printf "child exited with value %d\n", $? >> 8;
    }
}
print "\n*** FERTIG ***\n";


IP-Adresse, user und Passwort Pfade etc müssen natülich angepasst werden aber vielleicht hilft das als Lösungsansatz ?
mfG
dobra

1nelly1

Hallo dobra,

vielen Dank für das Skript, das zwar verwendet werden kann bei der Automatisierung, aber das eigentliche Problem nicht löst.
Denn das Skript lädt nur eine CSV-Datei herunter und ruft die Automatisierungskommandos von Shoppilot auf. Der entscheidende Punkt in der Aufstellung, nämlich "eine verknüpfte Access-Tabellen-Abfrage bereitet die Daten auf" wird durch das Skript nicht erledigt. Wie machen Sie das "vollautomatisch" (also ohne selbst Access zu öffnen), so dass dann eine Access-Datenbank vorliegt, auf die per ODBC zugegriffen werden kann? Ich kenne mich mit der Automatisierung von Access nicht aus.

Viele Grüße
1nelly1


dobra

#3
bin leider auch kein access-Profi  ;)

aber ich mache das so:

1) eine verknüpfte Tabelle zur Shop DB-Tabelle anlegen (ODBC)





bei "Datenquelle auswählen" dann die gewünschte lokale Shop-DB anklicken


(ob es auch mit einer online-DB geht weiß ich nicht)

und mit der Shop-Tabelle die man braucht verknüpfen



2)  die csv-Tabelle verknüpfen
(diese muss natürlich auf dem Rechner liegen -> das pl-Script ruft sie ja ab und speichert - aktualisiert - sie mit dem hier eingetragenen Pfad)

hier dann "Textdatei" wählen



den Pfad zu csv eintragen



mit dem access-Verknüpfungsassisten kann man dann ganz bequem die verknüpfte Tabelle erstellen


(wie DAS geht, brauche ich aber hoffentlich jetzt nicht im Detail zeigen  ;) )

3) in die Abfrage-Ansicht wechseln
Erstellen -> Abfrageentwurf  und die Shop und csv Tabelle wählen



in die SQL-Ansicht wechseln, das Statement eingeben und unter eindeutigen Nanen (damit ma's dann auch wieder findet ;) ) speichern

Was immer man dann Importieren will, kann man da aufbetreiten
Hier mal ein Beispiel wie so ein Statement bei mir ausschaut

SELECT hop_sitm.ITEMID, hop_sitm.MITEMID, hop_sitm.PRICE, hop_sitm.ARTNR, hop_sitm.MYFAKTOR, Webshop.Artikelnummer, Webshop.Bezeichnung, Webshop.Einh, Webshop.Lagerstand, Webshop.[VK-Preis exkl], IIf((hop_sitm.RECHNEN='div'),Webshop.Lagerstand/[hop_sitm].[MYFAKTOR]) AS dummy11, IIf((hop_sitm.RECHNEN='mal'),Webshop.Lagerstand*hop_sitm.MYFAKTOR,dummy11) AS dummy22, IIf((hop_sitm.RECHNEN='stk'),Webshop.Lagerstand,dummy22) AS LagerstadVari, IIf(([Webshop].[Lagerstand]=0 And [Webshop].[Bezeichnung] Like '*[*]'),"<font size='-2'> nicht mehr <br> lieferbar</font>",[hop_sitm].[VARIBESCH]) AS varibesch, IIf(([Webshop].[Lagerstand]=0 And [Webshop].[Bezeichnung] Like '*[*]'),"1",'') AS ausverk, IIf((Webshop.Lagerstand>0 And Webshop.Bezeichnung Like '*[*]' And hop_sitm.RECHNEN='div'),Webshop.Lagerstand/[hop_sitm].[MYFAKTOR]) AS dummy1, IIf((Webshop.Lagerstand>0 And Webshop.Bezeichnung Like '*[*]' And hop_sitm.RECHNEN='mal'),Webshop.Lagerstand*hop_sitm.MYFAKTOR,dummy1) AS dummy2, IIf((Webshop.Lagerstand>0 And Webshop.Bezeichnung Like '*[*]' And hop_sitm.RECHNEN='stk'),Webshop.Lagerstand,dummy2) AS lbsauto, hop_sitm.RECHNEN
FROM hop_sitm INNER JOIN Webshop ON hop_sitm.ARTNR=Webshop.Artikelnummer;


Das muss aber NUR EINMAL konfiguriert werden!
danach läufts wirklich mit dem autoimport Script von ahe vollkommen automatisch

ACHTUNG aber bei den SQL-Statements:
einige wenige SQL-Anweisungen wie z.B. "replace" funktionieren zwar in access aber wenn man die Tabelle dann importieren will kommt die Meldung "es wurde versucht vor den Anfang oder hinter das Ende ...."
aber meistens gibt es alternative Schreibweisen - dann muss man halt googeln  ;)

Wie man dann im WC die Importprofile anlegt und speichert wissen Sie?
mfG
dobra

1nelly1

Hallo dobra,

großartig! Genau das wollte ich sehen. Vielen Dank für die Mühe.
Da ich die CSV-Datei so wie sie ist in Shoppilot einlesen wollte hatte ich in Access nur eine verknüfte Tabelle angelegt. Diese Tabelle wird aber in dem Shoppilot-Fenster "Zuordnung der Tabellen" nicht angezeigt. Wenn man dagegen eine Abfrage-Tabelle in Access erstellt, dann wird diese auch in dem besagten Fenster angezeigt und kann importiert werden.
Die lokale Shoppilot-Datenbank benötige ich als Verknüpfung nicht und kann auf das SQL-Statement verzichten.

Bemerkung: Die von Ihnen angesprochene Meldung "es wurde versucht vor den Anfang oder hinter das Ende ...." habe ich nach meiner Erfahrung immer dann bekommen, wenn in dem Zuordungsfenster nicht alle Zuordnungen zu allen Tabellen gemacht worden sind, auch wenn man diese vielleicht nicht braucht,  z.B. wenn man nur Artikel importieren will. Irgendetwas muss da wohl immer eingetragen sein, damit Eintragungen von vorher genutzten Profilen verschwinden. Durch Klick auf das rote Kreuz unterbinde ich dann den Import der nicht gewünschten Tabellen.

Viele Grüße
1nelly1

P.S.: Ich finde es toll, was Sie hier für die Forumsteilnehmer alles tun.

dobra

ZitatDa ich die CSV-Datei so wie sie ist in Shoppilot einlesen wollte...

ach so...
das habe ich dann falsch verstanden
das ist dann natürlich viiiiiiiel einfacher  :)

Freut mich, dass ich helfen konnte
wenn Sie noch Fragen haben, bitte melden.
mfG
dobra