× Linguagem de Programação ADVPL

Perguntas Tratar quebra de linha campo Memo em relatório

Mais
9 anos 5 meses atrás #28237 por inocenciojr
Boa Noite Pessoal,

Alguém consegue me dar uma luz de como tratar as quebras de linha nos campos MEMO?
Estou tentando corrigir um fonte aqui mas não consigo corrigir isso. Registros mais antigos ele imprime certinho com as quebras de linha certas. Os registros mais novos ele não faz isso, ele trunca as frases.

Vou postar aqui o trecho que trata a impressão:
Do While !oReport:Cancel() .And. !(cAliasQry)->(Eof()) .And. (cAliasQry)->ZC_NUMOS == cNumOS
		
		cNumOS   := (cAliasQry)->ZC_NUMOS
		
		If oReport:Cancel()
			Exit
		EndIf
		
		oReport:IncMeter()
		
		For nVias := 1 to MV_PAR14
			//nBegin	 := 1
			oReport:nRow := oReport:LineHeight() * 80
			
		
			//TRATAMENTO PARA CAMPO MEMO
			cAuxDet := SZC->ZC_DIARION//MSMM((cAliasQry)->ZC_DIARIO)  	            // Leitura do campo memo da descricao detalhada
			_nLinh  := MLCount(cAuxDet,_nTamC)
			While (nBegin <= _nLinh)
				If oReport:Row() > oReport:LineHeight() * 72
					oReport:nRow := 10
					oReport:nCol := 10
					oReport:EndPage()
					oReport:nRow := 10
					oReport:nCol := 10
					oReport:Box( oReport:Row(),oReport:Col(),oReport:Row() + oReport:LineHeight() * ( 93 - nPrinted ) , 2290 )
					oReport:Say(oReport:LineHeight() * ( 92 - nPrinted ),2000,STR0014+Space(1)+;
					StrZero(If((nBegin/53)<=Int(nBegin/53),Int(nBegin/53),Int(nBegin/53)+1),2)+"/"+;
					StrZero(If((_nLinh/53)<=Int(_nLinh/53),Int(_nLinh/53),Int(_nLinh/53)+1),2),oFont2)
					
				EndIf
				cTxt := Memoline(OemToAnsi(cAuxDet),_nTamC,nBegin)+' '//(STRTRAN(STRTRAN(STRTRAN(Memoline(OemToAnsi(cAuxDet),_nTamC,nBegin,,.t.),CHR(13),""),CHR(10),""),'\13\10',""))+' '
				MSGINFO(cTXT)
				oReport:Say(oReport:Row(),300,cTxt)//oReport:PrintText(cTxt,oReport:Row(),300)
				oReport:SkipLine()
				nBegin++
			End
			
		Next nVias
		
		nPrinted ++
		
		(cAliasQry)->(DbSkip())
		
	EndDo

Obrigado,

Inocêncio

Por favor Acessar ou Registrar para participar da conversa.

Mais
9 anos 5 meses atrás - 9 anos 5 meses atrás #28250 por Darkbeo
Você poderia tentar utilizar as funções MLCount junto com a MemoLine

Exemplo:
For x := 1 To MLCount(CampoMemo, Tamanho)
  If !Empty( MLCount(CampoMemo, Tamanho) )
    If !Empty( MemoLine(CampoMemo, Tamanho, x) )
      oPrint:Say( nLin, 0001, OemToAnsi( MemoLine(CampoMemo, Tamanho, x) ))
    EndIf
  EndIf
Next x

Onde o tamanho é a quantidade de caracteres de cada linha.
Ultima edição: 9 anos 5 meses atrás por Darkbeo.

Por favor Acessar ou Registrar para participar da conversa.

Mais
9 anos 5 meses atrás #28266 por inocenciojr
Bom dia Roberto,

Obrigado pela ajuda. O fonte que tenho faz isso que passou com algumas "firulas" do antigo programador e utiliza a função PrintText ao invés da Say pois funciona melhor.(Testei com a função SAY, mas não ficou legal e também não fez o que eu precisava)
Porém descobri que na minha base local o mesmo fonte faz o que tem de ser feito.
Acredito que meu problema pode ter alguma relação com a versão do Top Connect e/ou com o Banco de Dados. Pois a minha base local é Sql Server e no servidor é DB2.
Se mais alguém tiver uma dica pode dizer e se eu encontrar a solução posto aqui.

Obrigado

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.158 segundos
Joomla templates by a4joomla