excel-Tabelle in eine eigene Tabelle umwandeln



  • ich möchte eine csv- oder excel-Tabelle in eine eigene Tabelle umwandeln, also in eine Tabelle, die einem eigenen Programm zugrundeliegt. Ich öffne also den ODBC-Administrator und melde meine csv/excel-Tabelle an. Anschließend lege ich ein neues C++Projekt an, füge ein paar wenige Eingabefelder ein und kompiliere. Keine Fehler. Aber wenn ich ausführe und dabei natürlich auf meine csv/excel-Tabelle zugreife, erhalte ich die Fehlermeldung: "Syntaxfehler in FROM-Klausel". Ich arbeite mit einer alten Visual-C++ 6 Version und MS-Office 2003, das sollte eigentlich zusammen passen.



  • @nckwdt sagte in excel-Tabelle in eine eigene Tabelle umwandeln:

    erhalte ich die Fehlermeldung: "Syntaxfehler in FROM-Klausel"

    Das FROM gehört doch zur SQL-Abfrage.
    Entweder hast du die SQL-Abfrage falsch zusammengabaut, oder die Angaben darin stimmen nicht.

    So ohne Glaskugel und Hühnerknochen kann ich nur auf Zeichen 42 tippen.



  • ich habe ja überhaupt nichts zusammen gebaut, das macht doch Visual C++ ale automatisch... Welche Infos brauchst du denn?



  • @dirkb welche Angaben meinst du?



  • @nckwdt sagte in excel-Tabelle in eine eigene Tabelle umwandeln:

    @dirkb welche Angaben meinst du?

    Im FROM-Teil steht der Tabellenname.

    (das ist alles nur geraten, da keine Informationen vorliegen.)



  • Außerdem ist das dann hier das falsche Unterforum!



  • @dirkb wie finde ich den FROM-Teil?



  • Wie hast du das Projekt denn erstellt? Mit dem "MFC App Wizard", wie in dem Video Microsoft Visual C++ 6.0: Database Connectivity (ODBC) gezeigt?

    Dann hat der Wizard entsprechende ".cpp"-Dateien dafür angelegt.



  • ja, hat er. Hier ein Auzug:
    // Set.h

    // Feld-/Parameterdaten
    //{{AFX_FIELD(CMetDaten4Set, CRecordset) long m_Nr; long m_Druck; //}}AFX_FIELD

    // View.h

    public:
    //{{AFX_DATA(CMetDaten4View)
    enum { IDD = IDD_METDATEN4_FORM }; CMetDaten4Set* m_pSet;
    //}}AFX_DATA

    //Set.cpp

    CMetDaten4Set::CMetDaten4Set(CDatabase* pdb)
    : CRecordset(pdb)
    {
    //{{AFX_FIELD_INIT(CMetDaten4Set)
    m_Nr = 0; m_Druck = 0; m_nFields = 2;
    //}}AFX_FIELD_INIT
    m_nDefaultType = snapshot;
    }

    CString CMetDaten4Set::GetDefaultConnect()
    {
    return _T("ODBC;DSN=Test");
    }

    CString CMetDaten4Set::GetDefaultSQL()
    {
    return _T("[Test].[csv]");
    }

    void CMetDaten4Set::DoFieldExchange(CFieldExchange* pFX)
    {
    //{{AFX_FIELD_MAP(CMetDaten4Set)
    pFX->SetFieldType(CFieldExchange::outputColumn);
    RFX_Long(pFX, _T("[Nr]"), m_Nr); RFX_Long(pFX, _T("[Druck]"), m_Druck);
    //}}AFX_FIELD_MAP
    }

    // View.cpp

    public:
    //{{AFX_DATA(CMetDaten4View)
    enum { IDD = IDD_METDATEN4_FORM };
    CMetDaten4Set* m_pSet;
    //}}AFX_DATA





  • @dirkb Das habe ich gelesen.... und? Was möchten Sie mir damit sagen? Bitte fassen Sie sich kurz! Danke.



  • @nckwdt sagte in excel-Tabelle in eine eigene Tabelle umwandeln:

    @dirkb Das habe ich gelesen.... und? Was möchten Sie mir damit sagen? Bitte fassen Sie sich kurz! Danke.

    Ich glaube er ist etwas verwirrt, weil Sie kein ordentliches minimales CodeBeispiel geliefert haben, bzw. das vorhandene ist mittelmäßig formatiert, die Fehlermeldung nach einem Select-Statement aussieht, dass sie nicht gepostet haben, der Thread im VCL-Bereich ist und alles in allem so der Eindruck rüberkommt, dass sie eigentlich nicht so genau wissen was Sie da tun, oder tun wollen.

    Wenn Sie hier Unterstützung haben wollen, werden Sie etwas mehr Informationen liefern müssen.



  • Gibt es hier jemanden, der mir helfen kann?



  • @it0101 Ich würde Ihnen gerne mehr Infos zukommen lassen, wenn Sie mir sagen können, welche Infos Sie benötigen. Bitte beachte Sie, daß ich auf diesem Gebiet kein Profi bin. Besten Dank im Voraus



  • Keiner weiß genau, was du gemacht hast.
    Mit "ein paar wenige Eingabefelder und dann compiliert" kann man bei einer Fehlersuche nicht viel anfangen.

    Bei der Datenbankabfrage werden Spalten aus Tabellen abgefragt. Diese Spalten und Tabellen haben Namen.
    Stimmen die denn überhaupt?

    Hast du in deinem erzeugten Code mal nach "FROM" gesucht?



  • @dirkb ja, ich habe nach FROM gesucht, das gibt es nicht. Ich habe es auch mit einer xls-Tabelle auch versucht, da konnte ich auf die Tabelle zugreifen aber da blieb das Programm laufend bei einzelnen Datensätzen hängen und konnte auch nur etwa 500 Datensätze abfragen. Mit csv_Tabellen hatte ich den oben beschriebenen Fehler. Da der Code aber vollständig automatisch von VC generiert wird, vermute ich einen Fehler bei der Behandlung im ODBC-Administrator. Jedenfalls werden die Spalten ja gefunden, die Überschriften werden ebenfalls gefunden, es werden Variablen angelegt, das alles funktioniert ja



  • Ich tippe mal darauf, daß die Methode GetDefaultSQL falsch ist, also der String ein falsches Format hat, s.a. SQL: Anpassen der SQL-Anweisung eines Recordsets (ODBC).
    Probiere mal:

    return _T("[Test.csv]"); // oder nur "[Test]"
    

    PS: Mittels GetSQL kannst du dir auch den komplett erzeugten SQL-Befehl mal ausgeben lassen.

    PPS: Wäre gut, wenn ein Mod diesen Beitrag nach "MFC" verschieben würde.



  • @nckwdt sagte in excel-Tabelle in eine eigene Tabelle umwandeln:

    @it0101 Ich würde Ihnen gerne mehr Infos zukommen lassen, wenn Sie mir sagen können, welche Infos Sie benötigen. Bitte beachte Sie, daß ich auf diesem Gebiet kein Profi bin. Besten Dank im Voraus

    Wenn Sie kundtun würden, wie es um Ihre Kenntnisse bestellt ist, und warum genau sie eine fast 20 Jahre alte Entwicklungsumgebung nutzen, könnte man vielleicht besser rausfinden, wie man Ihnen helfen kann.



  • @th69 nein, habe beides versucht. Wie schon gesagt, ich habe einen Fehler mit dem ODBC-Administrator im Verdacht, damit bin ich unsicher und habe vielleicht falsche Angaben gemacht. Ich habe "ANSI" und "Microsoft-Text-Treiber(txt, csv)" angegeben. Die aktuelle Software "Visual Studio" habe ich mir erst kürzlich herunter geladen und komme damit noch nicht klar. Die Tabelle "Test.csv" besteht aus zwei Spalten mit zwei Datensätzen aus jeweils zwei Ganzzahlen, ich habe diese Tabelle so einfach wie möglich gehalten, um die Fehlersuche einzugrenzen. Die xls-Tabelle ist umfangreicher, besteht aus über 1000 DS mit verschiedenartigen Variablen und ist eigentlich fehleranfälliger, funktioniert aber besser (siehe oben)



  • Hi Nckwdt,

    wenn Du schon im VCL-Forum bist, warum nimmst Du nicht Excelapplikation zum Auslesen der Exceldatei.

    Hier ein Beispiel in Delphi.

    procedure TEinleseForm.ExcelEinlesen;
    var
      ExcelApplication            : TExcelApplication;
      lcid                        : integer;
      WBk                         : _Workbook;
      WS                          : _WorkSheet;
      Temp           : string;
      TabZeile       : integer;
      TabSpalteNr    : Integer;
      n              : integer;
      BisSpalte      : integer;
      BisZeile       : integer;
    
      function GetZellposString( Spalte, Zeile : integer ) : AnsiString;
        function GetBuchstaben( Wert : integer ) : AnsiChar;
        begin
          result := AnsiChar( Wert + ( integer( 'A' ) - 1 ) );
        end;
      begin
        if ( Spalte <= 26 ) then
        begin
          result := Getbuchstaben( Spalte ) + IntToStr( Zeile );
        end
        else
        begin
          result := Getbuchstaben( ( Spalte - 1 ) div 26 ) + GetBuchstaben( ( ( Spalte -1 ) mod 26 ) + 1 ) + IntToStr( Zeile );
        end;
      end;
    
      function GetWert( Spalte, Zeile : integer ) : System.OleVariant;
      begin
        result :=  WS.Range[ GetZellposString( Spalte, Zeile ), GetZellposString( Spalte, Zeile ) ].Value;
      end;
    
    begin
      if Odlg.execute then  //Opendialog
      begin
        ExcelApplication := TExcelApplication.Create( Self );
        try
          try
            WBk := ExcelApplication.Workbooks.Open( Odlg.FileName, EmptyParam, EmptyParam,
                                          EmptyParam, EmptyParam, EmptyParam,
                                          EmptyParam, EmptyParam, EmptyParam,
                                          EmptyParam, EmptyParam, EmptyParam,
                                          EmptyParam, LCID);
            ExcelApplication.Visible[lcid] := true;
            ws := ExcelApplication.Sheets[ 'Blattname' ] as _WorkSheet;
            ws.Activate(lcid);
            BisZeile  := 10;
            BisSpalte := 10;
            TabZeile := 1;
            for TabZeile := 1 to BisZeile do
            begin
              for TabSpalteNr := 1 to BisSpalte do
              begin
                try
                  Temp := Trim( GetWert( TabSpalteNr, TabZeile  ) );
                  if Trim( Temp ) <> '' then
                    StringGridZiel.Cells[ TabSpaltenr, TabZeile ] := Temp;
                except
                end;
              end;
            end;
          except
            Meckern( 'Excelmappe "' + Odlg.FileName + '" konnte nicht geöffnet werden' );
          end;
    
        finally
          ExcelApplication.free;
        end;
      end;
    end;
    

    Nur noch nach C++ umübersetzen und es müsste laufen

    Gruß Mümmel