Добавлено: Ср Ноя 20, 2019 2:57 pm Заголовок сообщения: Вопрос по экспорту в медок
Добрый день. Возник тут вопросик по экспорту отчетов в медок. Канешно, наверное, было бы правильно у них на форуме этот вопрос задать, но решил для начала тут. Вдруг кто знает.
Итак. Есть такие отчеты как баланс. Их там 6шт. В медке эти отчеты располагаются как главный (форма1), и дочерние. Так вот. Если я импортирую их туда по очереди (например вначале форму1, потом форму2), то медок создает при первом экспорте форму1, и 6 пустых дочерних форм. При втором экспорте создается опять основная форма1, и 6 дочерних, но теперь форма2 заполнена. Чтобы иерархия была правильная и формы не дублировались, надо экспортировать сразу все формы. Но даже при этом если хочется что-то обновить, то нужно удалять то, что есть в медке и импортировать весь пакет отчетов по новому.
Хотелось бы, чтобы при импорте медок не создавал новые формы, а обновлял те, что уже есть за заданный период.
Импорт могу делать через XML и ZDI.
По XML. Из документации понял что за обновление отвечает тег LINKED_DOCS, но не понял как его заполнять. К тому-же по идее надо знать, что уже есть в медке, а если он сам создал некоторые отчеты (при импорте формы1 создаются пустые дочерние форма2-форма6), то моя отправляющая программе не знает, естественно, от этом.
Добавлено: Чт Дек 05, 2019 2:50 pm Заголовок сообщения: Re: Вопрос по экспорту в медок
Руслан писал(а):
Из документации понял что за обновление отвечает тег LINKED_DOCS, но не понял как его заполнять.
В теге LINKED_DOCS имя родительского ИЛИ подчинённого файла - взаимные ссылки. Не надо стесняться экспортировать из медка какой-нибудь отчёт и разобраться с тегами на живом примере, а не из описания.
Код:
Sub XMLREP ' вызывается по кнопке.
pthXML=MeDocFolderPath()
Dim niCode : niCode=niTAG() : If Len(niCode)=0 Then MsgBox "Сначала необходимо установить свойства налоговой инспекции." : Exit Sub
If Not CreateObject("Scripting.FileSystemObject").FolderExists(pthXML) Then MsgBox "Записать не удастся: папка "&pthXML&" не существует" : Exit Sub
On Error Resume Next : Call CreateObject("MSXML2.DOMDocument.4.0") ' проверка здесь, чтобы не гавкал 4 раза.
If err.Number<>0 Then MsgBox "Невозможно создать объект MSXML2.DOMDocument.4.0, нужно установить msxml4SP2.msi" : Exit Sub : End If : On Error goto 0
Dim x, XMLfileName5, XMLfileName6, XMLfileName2, XMLfileName1, er 'вернётся из процедуры формирования XML
Set x=MakeBueBookXML(op.Date, niCode, XMLfileName1, "J3000411") ' только чтобы получить XMLfileName1
Set x=MakeBueBookXML(op.Date, niCode, XMLfileName5, "J3040511") ' "E04T05I" FillTrans1 ts5
Call AddLinkedDoc(x,XMLfileName1,1,2)
If Not x Is Nothing Then x.Save pthXML&XMLfileName5 : correctXML(pthXML&XMLfileName5) : er=er& test_xml_xsd(pthXML&XMLfileName5, "J3040511.xsd")
Set x=MakeBueBookXML(op.Date, niCode, XMLfileName6, "J3040611") ' "E04T06I" FillTrans2 ts6
Call AddLinkedDoc(x,XMLfileName1,1,2)
If Not x Is Nothing Then x.Save pthXML&XMLfileName6 : correctXML(pthXML&XMLfileName6) : er=er& test_xml_xsd(pthXML&XMLfileName6, "J3040611.xsd")
Set x=MakeBueBookXML(op.Date, niCode, XMLfileName2, "J3040111") ' "Додаток 4"
Call AddLinkedDoc(x,XMLfileName1,1,2)
If Not x Is Nothing Then x.Save pthXML&XMLfileName2 : correctXML(pthXML&XMLfileName2) : er=er& test_xml_xsd(pthXML&XMLfileName2, "J3040111.xsd")
Set x=MakeBueBookXML(op.Date, niCode, XMLfileName1, "J3000411") ' "Перелiк таблиць звiту"
Call AddLinkedDoc(x,XMLfileName2,1,1) : Call AddLinkedDoc(x,XMLfileName5,2,1) : Call AddLinkedDoc(x,XMLfileName6,3,1)
If Not x Is Nothing Then x.Save pthXML&XMLfileName1 : correctXML(pthXML&XMLfileName1) : er=er& test_xml_xsd(pthXML&XMLfileName1, "J3000411.xsd")
MsgBox "Созданы файлы в папке "&pthXML&vbCrLf& vbTab&XMLfileName5&vbCrLf& vbTab&XMLfileName6&vbCrLf& vbTab&XMLfileName2&vbCrLf& vbTab&XMLfileName1
MsgBox er, vbInformation, "Стандартная проверка структуры по XSD схемам."
End Sub
Function GetXMLFName(xml,DocNo) ' номер документа в заголовок не предаётся, там вроде как номер подачи
Dim ar : ar=Array("C_REG", 2, "C_RAJ", 2, "TIN", 10, "C_DOC", 3, "C_DOC_SUB", 3, "C_DOC_VER", 2, _
"C_DOC_STAN", 1, "C_DOC_TYPE", 2, "C_DOC_CNT", 7, "PERIOD_TYPE", 1, "PERIOD_MONTH", 2, "PERIOD_YEAR", 4, "C_STI_ORIG", 4)
Dim n : For n=0 To UBound(ar) Step 2
Dim key : key=ar(n)
Dim val : val=xml.SelectSingleNode("//"&key).NodeTypedValue
: If key="C_DOC_CNT" Then val=Replace(Trim(val),"/","F") ' если вдруг номер документа передаётся в заголовок, но вроде там №пп "1"
Dim ss : ss=ss & Right("0000000000"&val, ar(n+1))
Next
GetXMLFName=ss & ".xml"
'GetXMLFName=ss & Replace(Trim(DocNo),"/","F") & ".xml"
End Function
Sub AddLinkedDoc(xml,fnm,num,tp)
Dim LD : Set LD=xml.SelectSingleNode("/DECLAR/DECLARHEAD/LINKED_DOCS") ' Set xmlDOM=xml.OwnerDocument
If LD Is Nothing Then
Dim dh : Set dh=xml.SelectSingleNode("/DECLAR/DECLARHEAD")
Dim df : Set df=dh.SelectSingleNode("D_FILL")
: Set LD=dh.InsertBefore(xml.CreateElement("LINKED_DOCS"), df)
End If
Dim dc : Set dc=LD.AppendChiLD(LD.OwnerDocument.CreateElement("DOC"))
: dc.SetAttribute "NUM", num
: dc.SetAttribute "TYPE", tp
dc.AppendChild(LD.OwnerDocument.CreateElement("C_DOC")).NodeTypedValue= Mid(fnm,15,3) ' 15,16,17
dc.AppendChild(LD.OwnerDocument.CreateElement("C_DOC_SUB")).NodeTypedValue= Mid(fnm,18,3) ' 18,19,20
dc.AppendChild(LD.OwnerDocument.CreateElement("C_DOC_VER")).NodeTypedValue= CLng(Mid(fnm,21,2)) ' 21,22
dc.AppendChild(LD.OwnerDocument.CreateElement("C_DOC_TYPE")).NodeTypedValue=CLng(Mid(fnm,24,2)) ' 24,25 ' номер нового звітного (уточн) документа у зв.періоді
dc.AppendChild(LD.OwnerDocument.CreateElement("C_DOC_CNT")).NodeTypedValue= CLng(Mid(fnm,26,7)) ' 26..32
dc.AppendChild(LD.OwnerDocument.CreateElement("C_DOC_STAN")).NodeTypedValue= Mid(fnm,23,1) ' 23
dc.AppendChild(LD.OwnerDocument.CreateElement("FILENAME")).NodeTypedValue=fnm
End Sub
Sub correctXML(fpn) ' добавляет переносы строк. Отступы не умеет, надо бы научить.
Dim sXML : sXML=CreateObject("Scripting.FileSystemObject").OpenTextFile(fpn).ReadAll
sXML=Replace(sXML, "><", ">" & vbCrLf & "<") : CreateObject("Scripting.FileSystemObject").CreateTextFile(fpn).Write sXML
End Sub
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах