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



  • 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



  • lieber Mümmel, ...... weil ich mich mit Delphi überhaupt nicht auskenne und weil ich auch keinen Delphi-Compiler habe... ich mache das eben in C++, aber trotzdem vielen Dank für deine Mühe!



  • Hi Nckwdt,
    drum sagte ich ja auch nach C++ umübersetzen. Der C++Builder kann praktisch alles das was Delphi kann genau so. Manches eleganter, anderes umständlicher, aber genau genommen sind es zweieiige Zwillinge.
    Die gesamte VCL des C++-Builders ist in Delphi geschrieben und dei beiden harmonieren bestens miteinander.
    Aufgrund der Ähnlichkeiten beider Sprachen dürfte es keine wesentlichen Probleme geben, den Delphi-Quelltext nach C++ rüberzuübersetzen. Vieles kann man da mit suchen und ersetzen machen.
    Begin und End durch geschweifte Klammern, = durch == ersetzen und danach :== durch =,
    bei den deklarationen die Reihenfolge ändern und den Dopelpunkt wegnehmen...

    Gruß Mümmel



  • @muemmel: Der TE verwendet aber VS mit einem MFC-Projekt. Daher auch mein Wunsch:

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