Erkenne meinen Fehler nicht

Hallo hab es geschafft :

Code:
void MusicManagement ::StoreDB(MusicPiece NewSong)
{
	CDatabase music_data;
	CString SqlString;
	CString strErgebnis;

		// Open the database
		music_data.Open( "MUSIK" );
		

		music_data.BeginTrans();
		SqlString.Format( "('%s','%s','%s','%s','%s')", NewSong.Shelf.c_str(),NewSong.Interpreter.c_str(),NewSong.Title.c_str(),NewSong.Rubric.c_str(),NewSong.CD.c_str());
		strErgebnis = "Insert into [tbl_Datenbank](Regal,Interpret,Titel,Rubrik,CD) values ";
		strErgebnis += (LPCTSTR)SqlString;
		TRACE(strErgebnis);

                strErgebnis.Replace("''","NULL");

		music_data.ExecuteSQL(strErgebnis); // SQL absenden
		music_data.CommitTrans(); // daten festschreiben

		music_data.Close();

}

Funktioniert zwar nur wenn ich wirklich alle Felder ausfülle, also ich kann keins freilassen aber das ist ja auch erstmal nebensache.

Ich hab aber noch eine andere frage, wie kann ich mehrere Seiten ausdrucken lassen :confused: bzw. was muss ich dafür in meinen Code eingeben, damit der Compiler erkennt wann er eine neue Seite drucken muss :confused:


Habe den Fehler da Access wegen dem Primärschlüssel eine NULL erwartet muss man vor das Excute der Access Datenbank eine NULL geben (siehe markierung)
 
Zuletzt bearbeitet:
Uups, die Frage ist zu allgemein gestellt. Was willst du denn ausdrucken und wie soll das aussehen. Oder wenn du jetzt schon was druckst: Nutzt du die Standard-Druckbefehle und die OnDraw-Methode oder hast du OnPrint überschrieben?

Mfg

langer
 
Also das ist der Druckercode der funktioniert einwandfrei:

Code:
// p points to the start of the buffer, pSize holds the number of characters
void PrintList(CListCtrl &list)
{
    CDC             dc;
    CPrintDialog    printDlg(FALSE);
    CRect           r;
    int             nHeight;

    // ask the user to select a printer
    if (printDlg.DoModal() == IDCANCEL)
        return;

    // Attach a printer DC
    dc.Attach(printDlg.GetPrinterDC());
    dc.m_bPrinting = TRUE;

    // use Textmappingmode, that's easiest to map the fontsize
    dc.SetMapMode(MM_TEXT);

    // setup font specifics
    LOGFONT LogFont;

    CFont	aFont, *oldFont;

    LogFont.lfHeight = -MulDiv(10, GetDeviceCaps(dc, LOGPIXELSY), 72);
    LogFont.lfWidth = 0;
    LogFont.lfEscapement = 0;
    LogFont.lfOrientation = 0;
    LogFont.lfWeight = 0;
    LogFont.lfItalic = false;
    LogFont.lfUnderline = 0;
    LogFont.lfStrikeOut = 0;
    LogFont.lfCharSet = ANSI_CHARSET;
    LogFont.lfOutPrecision = OUT_TT_PRECIS;
    LogFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    LogFont.lfQuality = DEFAULT_QUALITY;
    LogFont.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
    lstrcpy (LogFont.lfFaceName, "MS Sans Serif");
    dc.SetBkMode(OPAQUE);
    aFont.CreateFontIndirect ( &LogFont );
    // ok, we've build the font, now use it
    oldFont = dc.SelectObject( &aFont );

    // Get the application title
    CString strTitle;
    strTitle.LoadString(AFX_IDS_APP_TITLE);

    // Initialise print document details

    DOCINFO di;
    ::ZeroMemory (&di, sizeof (DOCINFO));
    di.cbSize = sizeof (DOCINFO);
    // application title appears in the spooler view
    di.lpszDocName = strTitle;

//*****************Begin a new print job**************************************************
	CString Line;	

	BOOL bPrintingOK = dc.StartDoc( &di );



    // Get the printing extents and store in the m_rectDraw field of a
    // CPrintInfo object
    CPrintInfo Info;
    int w = dc.GetDeviceCaps(HORZRES);
    int h = dc.GetDeviceCaps(VERTRES);
    Info.m_rectDraw.SetRect(0,0, w, h);

    const char *startAt = LPCTSTR(Line);
    int totalDone = 0;
    int lengthToGo = Line.GetLength();

 //   for (UINT page = Info.GetMinPage();
  //  bPrintingOK ; page++)
    
	

        // begin new page
		int page  = Info.GetMinPage();
        dc.StartPage();
        Info.m_nCurPage = page;

		
        // calc how much text fits on one page
        r = Info.m_rectDraw;
        r.bottom = r.top;
        int i = 0;
        while (r.bottom < Info.m_rectDraw.bottom && (totalDone + i < lengthToGo) )
        {
            r.right = Info.m_rectDraw.right;
            nHeight = dc.DrawText(startAt, i++, r,
                DT_CALCRECT|DT_WORDBREAK|DT_NOCLIP|DT_EXPANDTABS);
        }
        // go one back to assure correct height
        if (r.bottom >= Info.m_rectDraw.bottom)
            i--;

		//Print all entries from the list

		int y = 0;
		for (int item = 0; item<list.GetItemCount(); item++)
		{
			CRect rect( 0, 0, 300, 50 );
			rect = Info.m_rectDraw;
			rect.OffsetRect( 0, y );

			for ( int subItem = 0; subItem < 5; ++subItem )
			{
				Line =  list.GetItemText( item, subItem );
				dc.DrawText( 
						LPCTSTR(Line), 
						Line.GetLength(), 
						rect, 
						DT_WORDBREAK|DT_NOCLIP|DT_EXPANDTABS);
				rect.OffsetRect( 600 + 20, 0 );
			}

			y += 50;
		}
		
			
	// end page
	bPrintingOK = (dc.EndPage() > 0);

    // end a print job
    if (bPrintingOK)
        dc.EndDoc();
    else
        // abort job.
        dc.AbortDoc();


    // restore font
    dc.SelectObject(oldFont);
    // free font memory
    aFont.DeleteObject();
    // detach the printer DC
    dc.Detach();
}

Ich habe nur absolut keine Ahnung was ich machen muss um mehrere Seiten ( wenn erfordrlich) auszudrucken.
 
Wo die Seite umbricht darfst du entscheiden (sonst macht es der Drucker).

Du gibts einfach innerhalb deines Listenausdrucks ein EndPage gefolgt von einem StartPage an und schon druckt Windows alles innerhalb eines StartPage/EndPage auf eine Seite (wenn es denn draufpasst).
 
Ganz so einfach ist das nicht, wenn du einen sinnvollen Ausdruck willst, denke ich.
Du hast doch schon eine Schleife implementiert.
// for (UINT page = Info.GetMinPage();
// bPrintingOK ; page++)
Nur ist es hier auskommentiert.
Du kannst jetzt zwei Dinge machen:
1. Du druckst ab StartPage die erste Seite, fügst nachdem EndPage wieder ein
StartPage und EndPage ein und druckst dazwischen die zweite Seite.
Oder aber (eleganter), du nutzt eine Schleife. Dann mußt du aber anhand der Schleifendurchläufe ermitteln, was gerade gedruckt werden soll.
Code:
for (UINT page = Info.GetMinPage();page<Info.GetMaxPage(); page++)
{
   dc.StartPage();
   switch(page)
   {
   case Info.GetMinPage():
       //hier wird Seite 1 gedruckt
      break;
   case Info.GetMinPage+1:
      //hier Seite 2
      break;
   }
   dc.EndPage();
}
Natürlich kannst die Schleife auch einfacher machen mit
Code:
for(page=1;page<sovielSeiten;page++)
und dann einfach die Seitennummern switchen.
So mache ich das jedenfalls immer.

Mfg

langer
 
Zuletzt bearbeitet:
Danke aber wenn ich diesen Switch benutze druckt der mir dann nicht immer zwei Seiten :confused: Auch wenn ich nur eine habe Und desweiteren was mach ich wenn ich 5 Seiten hab muss ich dann nen Switch bauen der z.B. 100 Seiten druckt
 
Nein, das Programm druckt immer soviel Seiten aus, wie du in der Schleife vorgibst. Wenn allerdings auf den Seiten immer nur dasselbe steht nur mit anderen Inhalten aus einem Array, kannst du dir das switchen sparen und einfach meineDaten[page] benutzen. Du mußt nur halt festlegen, was auf die Seite soll, woher soll das Programm das sonst wissen.

Mfg

langer
 

Neue Beiträge

Zurück