; genrep.def : Declares the module parameters for the DLL.
LIBRARY "genrep"
DESCRIPTION 'genrep Windows Dynamic Link Library'
EXPORTS
; Explicit exports can go here
AboutDLL @2
LoadWord @3
RunRepDial @4
RunReport @5
RunRep @6
RunDial @7
LoadWordHLM @8
Параметры
fname - полный путь к шаблону
  (например "..\sab\formats.sab")
isd - флаг
isd = 0 - работа в текущей папке
isd = 1 - работа в папке шаблона
isd = 8 - не показывать прогресс
isd = 16 - не открывать отчет (Word,Excel)
для объединения параметры сложить
  isd = 1+8+16 - работа в папке шаблона,не показывать прогресс и не открывать отчет
//...
// Фрагмент кода для использования genrep.dll на С# (H.Бехбудов)
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
[DllImport("Genrep.dll",EntryPoint="RunRepEx")]
//public static extern int RunRep(String cName,uint Isd);
public static extern int RunRepEx(String cName,uint Isd,String ConStr );
//...
// RunRep("Doc.sbx",0);
RunRepEx("ora.sbx",0,"Provider=MSDAORA.1;Password=pas_oracle;User ID=user_oracle;Data Source=sid_oracle;Persist Security Info=True;");
}
}
Пример определения и вызова генератора для Visual Foxpro приложений
DECLARE Integer RunRep IN genrep.dll AS Runr String @cName, Integer Isd
DECLARE Integer RunDial IN genrep.dll AS Rund String @cName, Integer Isd =Runr('namefile.sab' , 0+1)
=Rund('namefile.sab' , 0) && работа в текущей папке
=Rund('namefile.sab' , 1) && работа в папке шаблона
=Runr('namefile.sab' , 0+16) && не вызывать Word
=Runr('namefile.sab' , 0+8+16) && не вызывать Word, не показывать Progress Bar
* ADODB
DECLARE Integer RunRepEx IN genrep.dll AS RunRepEx String @cName, Integer Isd , String @ConStr
RunRepEx("..\sql\access.sab",1,"Provider=VFPOLEDB;Data Source=sql\nort\northwind.dbc;Collating Sequence=machine;")
RunRepEx("..\sql\products.sbx",1,"Provider=VFPOLEDB;Data Source=sql\nort\northwind.dbc;Collating Sequence=machine;")
Пример геренации шаблона на лету для Visual Foxpro приложений
Пример определения и вызова генератора для Visual Basic приложений
fgenrep.bas:
'Описание функций библиотеки Genrep.dll
Public Declare Function RunDial Lib "genrep.dll" (ByVal SabName As String, ByVal nFlag As Integer) As Integer
Public Declare Function RunRep Lib "genrep.dll" (ByVal SabName As String, ByVal nFlag As Integer) As Integer
Public Declare Sub AboutDLL Lib "genrep.dll" ()
Declare Function OemToCharBuff Lib "user32" Alias "OemToCharBuffA" (ByVal lpszSrc As String, ByVal lpszDst As String, ByVal cchDstLength As Long) As Long
Public Sub Genrep_About()
AboutDLL
End Sub
'Запуск отчета в режиме диалога
Public Sub Genrep_RunDialog(sab As String)
ret = RunDial(sab, 1)
End Sub
'Запуск отчета на выполнение
Public Sub Genrep_RunReport(NameSab As String, ByVal nFlag As Integer)
ret = RunRep(NameSab, nFlag)
End Sub
'OEM to ANSI
Public Function ToAnsi(ByVal S As String) As String
Dim Buffer As String * 1000
OemToCharBuff S, Buffer, Len(S)
ToAnsi = Trim(Buffer)
End Function
'Запись курсора в DBF
Public Sub CreateDbfFromRecordset_VFP(r As ADODB.Recordset, ByVal DbfName As String, DbfFolder As String)
Dim cn As New ADODB.Connection, f As ADODB.Field, S As String, sDbfFile As String
Dim rr As New ADODB.Recordset, i As Integer, ii As Integer
sCon = "driver=Microsoft dBase Driver (*.dbf);Exclusive=Yes;SourceType=DBF;Collate=machine;SourceDB=" & DbfFolder
cn.Open sCon
sDbfFile = DbfFolder & DbfName & ".dbf"
On Error Resume Next
GetAttr sDbfFile
If Err.Number = 0 Then Kill sDbfFile
On Error GoTo 0
For Each f In r.Fields
If Len(S) Then S = S & ","
Select Case f.Type
Case adUnsignedTinyInt, adSmallInt, adInteger, adSingle, adDouble, adCurrency, adBoolean
S = S & "" & f.Name & " Integer"
Case adDate
S = S & "" & f.Name & " Date"
Case adVarChar, adVarWChar, adChar, adWChar
S = S & "" & f.Name & " Char(" & f.DefinedSize & ")"
End Select
Next f
sCmd = "CREATE TABLE " & DbfName & " (" & S & ")"
cn.Execute sCmd
rr.Open "SELECT * FROM " & DbfName, cn, adOpenStatic, adLockOptimistic
ii = r.Fields.Count - 1
Do Until r.EOF
rr.AddNew
For i = 0 To ii
rr(i) = r(i)
Next i
rr.Update
r.MoveNext
Loop
End Sub
main.bas:
'Собственно сами вызовы
cst = "Provider=SQLOLEDB.1;User Id=1cReader;Password=123;Initial Catalog=rb;Data Source=Serv_1C"
con.Open cst
Set rst_a = con.Execute("select top 10 Code, Descr from SC6482")
' скидываем в DBF
CreateDbfFromRecordset_VFP rst_a, "temp", "" ' "C:\1CDATA\programm\genrep\"
rst_a.Close
Set rst_a = Nothing
con.Close
' Выводим в RTF
Genrep_RunReport "sab\sprav.sab", 0
Пример определения и вызова генератора для 1С:Предприятие
genrep.ert:
Перем КаталогGenrep;
Процедура Сформировать()
КаталогGenrep = "C:\genrep\";
ФайлШаблон = "Nomen.sab";
Номенклатура = создатьОбъект("Справочник.Номенклатура");
ИмяФайла=КаталогGenrep + "Genrep1c\temp.dbf";
База = СоздатьОбъект("XBase");
Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
ФС.УдалитьФайл(ИмяФайла);
конецесли;
База.ДобавитьПоле("code","N",6,0);//Код
База.ДобавитьПоле("Descr","C",30,0);//Количество
База.ДобавитьПоле("Group","C",30,0);
База.СоздатьФайл(ИмяФайла);
КолвоЗаписей = 0;
Номенклатура.ВыбратьЭлементы();
Пока Номенклатура.ПолучитьЭлемент()=1 цикл
сообщить(Номенклатура);
Если Номенклатура.ЭтоГруппа() = 0 тогда
База.Добавить();
База.code = Число(Номенклатура.Код);
База.Descr = Номенклатура.Наименование;
База.Group = Номенклатура.Родитель.Наименование;
База.Записать();
конецесли;
КолвоЗаписей = КолвоЗаписей + 1;
Если КолвоЗаписей > 100 тогда
прервать;
конецесли;
конеццикла;
База.ЗакрытьФайл();
База = "";
//Выполнить отчет
ЗапуститьПриложение(КаталогGenrep+"dorep.exe "+сокрлп(ФайлШаблона));
КонецПроцедуры
Процедура ЗапуститьDoRep()
//Редактировать шабон
ЗапуститьПриложение(КаталогGenrep+"dorep.exe ");
КонецПроцедуры
Процедура ВыбратьФайл()
файл=ФайлШаблона;
Кат =КаталогGenrep;
ФС.ВыбратьФайл(0,файл,Кат,,);
ФайлШаблона = Кат + файл;
КонецПроцедуры
КаталогGenrep = "C:\genrep\";
ФайлШаблона = КаталогGenrep + "Genrep1c\Nomen.sab";