MS SQL + MS Word OLE

Garafutdin
Дата: 08.06.2011 10:48:19
Добрый день коллеги!

Не получается решить одну задачу:
MS SQL SERVER создает документ MS Word
Вставляет строки

Потом необходимо сделать замену вставленных строк <<Find&Replace>>

Пишу следующий код:
Exec @RetCode = sp_OAMethod @WordObject, 'Documents.Add', @Document OUTPUT
--EXEC @RetCode = sp_OAMethod @WordObject, 'Documents.open', @Document OUT, 'C:\Temp\SQLServer1.docx'
select @RetCode
Exec @RetCode = sp_OAMethod @WordObject,'Selection.TypeText("GGGGGGGGG TTTTTTTTTTTTTTTTTTTTTTT1        ")'
Exec @RetCode = sp_OAMethod @WordObject,'Selection.TypeText("BBBBBBBBBBBBBBBBBBBBBBBBBBBB        JJJJJJJJJJJJJJ  ")'
Exec @RetCode = sp_OAMethod @WordObject,'Selection.TypeText(" XCVBVCXVBNVC  ")'


Exec @RetCode = sp_OASetProperty @WordObject,'Selection.Find.Text','G'
if @RetCode <> 0 select @RetCode as point1
Exec @RetCode = sp_OASetProperty @WordObject,'Selection.Find.Replacement.Text','QWERTY'
if @RetCode <> 0 select @RetCode as point2

Exec @RetCode = sp_OASetProperty @WordObject,'Selection.Find.Forward','True'
if @RetCode <> 0 select @RetCode as point3

Exec @RetCode = sp_OASetProperty @WordObject,'Selection.Find.Format','False'
if @RetCode <> 0 select @RetCode as point4

exec @RetCode = sp_OAMethod @WordObject,'Selection.Find.Execute',@Document OUTPUT,'wdReplaceAll' 
if @RetCode <> 0 select @RetCode as point5

Exec @RetCode = sp_OAMethod @WordObject, 'ActiveDocument.SaveAs("C:\Temp\SQLServer2.docx")' 
Exec @RetCode = sp_OAMethod @WordObject, 'Quit'
Exec sp_OADestroy @WordObject
Exec sp_OAStop 

Документ на диске создается, но поиск и замена не была сделана:
GGGGGGGGG TTTTTTTTTTTTTTTTTTTTTTT1        BBBBBBBBBBBBBBBBBBBBBBBBBBBB        JJJJJJJJJJJJJJ   XCVBVCXVBNVC  

Скажите пожалуйста кто знает как решить проблему
Уленшпигель
Дата: 08.06.2011 10:53:28
Garafutdin,

когда вы запускаете поиск, то курсор находится в конце введенного текста, а ищете вы вперед. но впереди ничего нет, поэтому ничего и не заменяется.
Garafutdin
Дата: 08.06.2011 11:00:57
Уленшпигель,

Делаю открытие документа, по идее курсор должен быть в начале, но тем не менее тоже самое((
Exec @RetCode = sp_OACreate 'Word.Application', @WordObject OUTPUT, 4
if @RetCode <> 0 select @RetCode as point10

EXEC @RetCode = sp_OAMethod @WordObject, 'Documents.open', @Document OUT, 'C:\Temp\SQLServer2.docx'
if @RetCode <> 0 select @RetCode as point0

Exec @RetCode = sp_OASetProperty @WordObject,'Selection.Find.Text','G'
if @RetCode <> 0 select @RetCode as point1
Exec @RetCode = sp_OASetProperty @WordObject,'Selection.Find.Replacement.Text','QWERTY'
if @RetCode <> 0 select @RetCode as point2

Exec @RetCode = sp_OASetProperty @WordObject,'Selection.Find.Forward','True'
if @RetCode <> 0 select @RetCode as point3

Exec @RetCode = sp_OASetProperty @WordObject,'Selection.Find.Format','False'
if @RetCode <> 0 select @RetCode as point4

--Exec @RetCode = sp_OASetProperty @WordObject,'Selection.Find.Wrap','wdFindContinue'
--select @RetCode
exec @RetCode = sp_OAMethod @WordObject,'Selection.Find.Execute',@Document OUTPUT,'wdReplaceAll' 
if @RetCode <> 0 select @RetCode as point5

Exec @RetCode = sp_OAMethod @WordObject, 'ActiveDocument.SaveAs("C:\Temp\SQLServer2.docx")' 
Exec @RetCode = sp_OAMethod @WordObject, 'Quit'
Exec sp_OADestroy @WordObject
Exec sp_OAStop 
Glory
Дата: 08.06.2011 11:24:02
exec @RetCode = sp_OAMethod @WordObject,'Selection.Find.Execute',@Document OUTPUT,'wdReplaceAll'
Разве это передает в Selection.Find.Execute нужный текст, по которому будет идти поиск/замена ?
Разве 'wdReplaceAll' будет передано именно в параметер Replace метода ?
Garafutdin
Дата: 08.06.2011 11:45:54
Glory,
ну думаю что да.

Я ориентируюсь на процедуру,которая у меня есть в Delphi, и которая отлично отрабатывает с OLE объектом


try  
    WordApp := CreateOLEObject('Word.Application');  
  except  
    on E: Exception do  
    begin  
      E.Message := 'Word is not available.';  
      raise;  
    end;  
  end;  

  try  
    { Hide Word }  
    WordApp.Visible := False;  
    { Open the document }  
    WordApp.Documents.Open(ADocument);  
    { Initialize parameters}  
    WordApp.Selection.Find.ClearFormatting;  
    WordApp.Selection.Find.Text := SearchString;  
    WordApp.Selection.Find.Replacement.Text := ReplaceString;  
    WordApp.Selection.Find.Forward := True;  
    WordApp.Selection.Find.Wrap := wdFindContinue;  
    WordApp.Selection.Find.Format := False;  
    WordApp.Selection.Find.MatchCase := wrfMatchCase in Flags;  
    WordApp.Selection.Find.MatchWholeWord := False;  
    WordApp.Selection.Find.MatchWildcards := wrfMatchWildcards in Flags;  
    WordApp.Selection.Find.MatchSoundsLike := False;  
    WordApp.Selection.Find.MatchAllWordForms := False;  
    { Perform the search}  
    if wrfReplaceAll in Flags then  
      WordApp.Selection.Find.Execute(Replace := wdReplaceAll)  
    else  
      WordApp.Selection.Find.Execute(Replace := wdReplaceOne);  
    { Save word }  
    WordApp.ActiveDocument.SaveAs(ADocument);  
    { Assume that successful }  
    Result := True;  
    { Close the document }  
    WordApp.ActiveDocument.Close(wdDoNotSaveChanges);  
  finally  
    { Quit Word }  
    WordApp.Quit;  
    WordApp := Unassigned;  
  end;  

Glory
Дата: 08.06.2011 11:53:52
sp_OAMethod objecttoken , methodname
    [ , returnvalue OUTPUT ] 
    [ , [ @parametername = ] parameter [ OUTPUT ] [ ...n ] ] 

sp_OAMethod @WordObject,'Selection.Find.Execute',
    @Document OUTPUT,
    'wdReplaceAll'
Тогда объясните, как вы передаете то нужные значения в правильные параметры метода ?
Уленшпигель
Дата: 08.06.2011 11:54:16
Garafutdin,

он то в начале, но что у вас представляет собой Selection? сначала нужно текст отметить. вам лучше сначала написать макрос в самом ворде, а потом уже переносить его куда-либо еще.