Colocando o conteúdo de um campo memo numa string


Como muitos já sabem, para criação de um campo memo virtual, e necessário que sejam criados dois campos, um de código e o outro com tipo memo virtual. E esses dados são gravados na tabela SYP. Para colocar este conteúdo numa variável, podemos criar uma simples função que leia todas as linhas da tabela SYP correspondente ao código do campo desejado. Podemos fazer por uma consulta SQL ou simplesmente usando o dbSelectArea() Exemplo: Local cCodigo:= SB1->B1_B1_DESC_P //Código da descrição em Português Local cTexto := U_LerMemo(cCodigo) A função poderia ficar assim:  

User Function LerMemo(cChave)
	Local nPos    := 0
	Local nTam 	  := Len(Space(TamSx3("YP_TEXTO")[1]))
	Local cLine	  := ""
	Local cString := ""
	DbSelectArea("SYP")
	SYP->(DbSetOrder(1))
	SYP->(DbGoTop())
	If(SYP->(DbSeek(xFilial("SYP") + cChave, .T.)))
		While SYP->(!Eof()) .And. ( cChave == SYP->YP_CHAVE ) .And. ( xFilial("SYP") == SYP->YP_FILIAL )
			nPos := At("\13\10",Subs(SYP->YP_TEXTO,1,nTam+6))
			If ( nPos == 0 )
				cLine := RTrim(Subs(SYP->YP_TEXTO,1,nTam))
				If ( nPos2 := At("\14\10", cLine) ) > 0
					cString += StrTran( cLine, "\14\10", Space(6) )
				Else
					cString += cLine
				EndIf
			Else
				cString += Subs(SYP->YP_TEXTO,1,nPos-1) + " "
			EndIf
			SYP->(DbSkip())
		End While
		SYP->(DbCloseArea())
	Endif
Return(cString)
Agora, lendo por uma consulta SQL, mas limitando as 3 primeiras linhas.
	cQuery := " SELECT " + CRLF
	cQuery += " EE9_COD_I CODIGO, " + CRLF
	cQuery += " ( " + CRLF
	cQuery += " 	SELECT  " + CRLF
	cQuery += " 		(CASE (SELECT COUNT(YP_TEXTO) FROM SYP010 WHERE YP_CHAVE=B1_DESC_GI AND YP_SEQ='001' AND D_E_L_E_T_='') WHEN 0 THEN '' ELSE (SELECT YP_TEXTO FROM SYP010 WHERE YP_CHAVE=B1_DESC_GI AND YP_SEQ='001' AND D_E_L_E_T_='') END) +  " + CRLF
	cQuery += " 		(CASE (SELECT COUNT(YP_TEXTO) FROM SYP010 WHERE YP_CHAVE=B1_DESC_GI AND YP_SEQ='002' AND D_E_L_E_T_='') WHEN 0 THEN '' ELSE (SELECT YP_TEXTO FROM SYP010 WHERE YP_CHAVE=B1_DESC_GI AND YP_SEQ='002' AND D_E_L_E_T_='') END) +  " + CRLF
	cQuery += " 		(CASE (SELECT COUNT(YP_TEXTO) FROM SYP010 WHERE YP_CHAVE=B1_DESC_GI AND YP_SEQ='003' AND D_E_L_E_T_='') WHEN 0 THEN '' ELSE (SELECT YP_TEXTO FROM SYP010 WHERE YP_CHAVE=B1_DESC_GI AND YP_SEQ='003' AND D_E_L_E_T_='') END)  " + CRLF
	cQuery += " 	AS MEMO " + CRLF
	cQuery += " FROM " + RETSQLNAME("SB1") + " SB1A " + CRLF
	cQuery += " WHERE B1_COD=EE9_COD_I " + CRLF
	cQuery += " AND SB1A.D_E_L_E_T_=' ' " + CRLF  
	cQuery += " AND B1_FILIAL='"+xFilial("SB1")+"' " + CRLF  
	cQuery += " ) DESCRICAO, " + CRLF
	cQuery += " EE9_UNIDAD UNIDADE, " + CRLF
	cQuery += " EE9_SLDINI QTDE, " + CRLF
	cQuery += " EE9_PSLQUN PESO, " + CRLF
	cQuery += " EE9_POSIPI NCM, " + CRLF
	cQuery += " EE9_PRCTOT TOTAL " + CRLF
	cQuery += " FROM " + RETSQLNAME("EE9") + " EE9 " + CRLF
	cQuery += " INNER JOIN " + RETSQLNAME("SB1") + " SB1B ON B1_FILIAL='"+xFilial("SB1")+"' AND SB1B.D_E_L_E_T_=' ' AND B1_COD = EE9_COD_I " + CRLF
	cQuery += " WHERE EE9.D_E_L_E_T_ = ' ' " + CRLF
	cQuery += " AND EE9_FILIAL = '"+xFilial("EE9")+"' " + CRLF
	cQuery += " AND EE9_PREEMB = '"+cEmbarque+"' " + CRLF 
	cQuery += " ORDER BY " + cOrdem
Tem outras formas, mas segue uma que pode facilitar seu dia a dia.