Автор | Сообщение |
|
| постоянный участник
|
Пост N: 134
Зарегистрирован: 27.07.08
|
|
Отправлено: 25.03.11 13:34. Заголовок: Экспорт данных в XML
Предыдущая прога уже готова и отлично работает. Но шефу надо выводить данные в универсальный формат обмена данными XML, причём с несколькими уровнями иерархии. Как заставить Harbour работать с форматом XML? Моя среда: BCC55+harbour+MiniGUI Extended
|
|
|
Ответов - 15
[только новые]
|
|
|
| Администратор
|
Пост N: 1860
Зарегистрирован: 23.05.05
|
|
Отправлено: 25.03.11 13:53. Заголовок: Я использую класс из..
Я использую класс из hwgui Этот же класс есть в поставке minigui: source\hbxml В harbour есть библиотечка contrib\hbmxml В xHarbour есть класс TXmlDocument, он же есть и в Harbour Выбирай - не хочу
|
|
|
|
| постоянный участник
|
Пост N: 135
Зарегистрирован: 27.07.08
|
|
Отправлено: 25.03.11 14:08. Заголовок: Спасибо большое! Но..
Спасибо большое! Но где бы документацию взять?
|
|
|
|
| Администратор
|
Пост N: 1861
Зарегистрирован: 23.05.05
|
|
Отправлено: 25.03.11 14:23. Заголовок: Документации как так..
Документации как таковой по этим классам нет Но классы несложные, примеры их использования имеются, и этого вполне достаточно для их освоения
|
|
|
|
| |
Пост N: 144
Зарегистрирован: 17.10.05
|
|
Отправлено: 27.03.11 11:46. Заголовок: Я использую уже давн..
Я использую уже давно - посмотрите фрагмент моего кода, может поможет "... oXmlDoc := TXmlDocument():New('<?xml version="1.0" encoding="windows-1251" ?>') oXmlRoot := TXmlNode():new(0,"DECLAR",{ "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", ; "xsi:noNamespaceSchemaLocation" => aTBL[nT]+".xsd" } oXmlDoc:oRoot:addBelow( oXmlRoot ) oXmlHead := TXmlNode():new(0, "DECLARHEAD" ) oXmlRoot:addBelow( oXmlHead ) oXmlHead:addBelow( TXmlNode():new(0, "VER",,"1.1") ) ..."
|
|
|
|
| постоянный участник
|
Пост N: 1722
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.03.11 16:56. Заголовок: krutoff пишет: посм..
krutoff пишет: цитата: | посмотрите фрагмент моего кода, может поможет |
| Ничего не понятно. Дайте хоть первоначальную информацию.... Зачем как и почему. А лучше тестовый пример маленький, выгрузка базы например. Заранее спасибо !
|
|
|
|
| |
Пост N: 9
Зарегистрирован: 08.02.11
|
|
Отправлено: 29.03.11 01:52. Заголовок: я в былые времена на..
я в былые времена начала XML делал файлы для налоговой как обычный текстовый файл с последовательным созданием тэгов
|
|
|
|
| |
Пост N: 2063
Зарегистрирован: 17.05.05
|
|
Отправлено: 29.03.11 06:43. Заголовок: Andrey пишет: Дайте..
|
|
|
|
| постоянный участник
|
Пост N: 1723
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.03.11 21:22. Заголовок: Dima пишет: http://..
Dima пишет: цитата: | http://www.rsdn.ru/article/xml/xml-1.xml |
| Спасибо ! А дальше ? По примеру ?
|
|
|
|
| |
Пост N: 12
Зарегистрирован: 03.09.09
|
|
Отправлено: 31.03.11 16:16. Заголовок: Не знаю или актуальн..
Не знаю или актуально, но еще как вариант через DOMDocument. Типа так (заполнение данными шаблона XML) : xmlDoc := CreateObject( "Msxml2.DOMDocument.6.0" ) xmlDoc:async := FALSE xmlDoc:load("Test.xml" ) xmlErr := xmlDoc:parseError IF xmlErr:errorCode <> 0 MsgExclamation( "Ошибка, код: " + AllTrim( Str( xmlErr:errorCode ) ) ) RETURN .f. ENDIF objNodeList := xmlDoc:getElementsByTagName("Tag1" ) objNodeList:item( 0 ):text = "Значение для Tag1" .... .... // создать элемент newElem := xmlDoc:createElement( "SECPARAM" ) objNodeList1:appendChild( newElem ) objNodeList1:lastChild:text = "Значение" .... xmlDoc:async := FALSE xmlDoc:validateOnParse := TRUE xmlDoc:save( "fileOut" )
|
|
|
|
| |
Пост N: 67
Зарегистрирован: 05.11.05
|
|
Отправлено: 27.05.11 14:09. Заголовок: А загрузить базу так..
А загрузить базу так можно? Могу я с помощью xHarbour взять из интернета файл и прочитать из него данные в программу?
|
|
|
|
| постоянный участник
|
Пост N: 341
Зарегистрирован: 27.07.08
|
|
Отправлено: 17.05.24 15:38. Заголовок: krutoff пишет: Я и..
krutoff пишет: цитата: | Я использую уже давно - посмотрите фрагмент моего кода, может поможет "... oXmlDoc := TXmlDocument():New('<?xml version="1.0" encoding="windows-1251" ?>') oXmlRoot := TXmlNode():new(0,"DECLAR",{ "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", ; "xsi:noNamespaceSchemaLocation" => aTBL[nT]+".xsd" } oXmlDoc:oRoot:addBelow( oXmlRoot ) oXmlHead := TXmlNode():new(0, "DECLARHEAD" ) oXmlRoot:addBelow( oXmlHead ) oXmlHead:addBelow( TXmlNode():new(0, "VER",,"1.1") ) ..." |
| Это хорошо, но как это сделать в ДОСявом Клиппере? Как только сейчас выяснилось, шефу нужен уже даже не PDF, а электронный документ особого формата. Пока что удалось выяснить, что это XML. Такая вот хрень, примерно. Скрытый текст <ubl:Invoice xmlns:ubl="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"> <!-- XRechnung created by Invoice Portal powered by Webware Internet Solutions GmbH --> <!-- For more information visit our Website: https://invoice-portal.de --> <!-- Or contact us by E-Mail: info@invoice-portal.de --> <cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0</cbc:CustomizationID> <cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID> <cbc:ID>RE-2024-03</cbc:ID> <cbc:IssueDate>2024-02-27</cbc:IssueDate> <cbc:DueDate>2024-03-28</cbc:DueDate> <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode> <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode> <cbc:BuyerReference>992-90009-96</cbc:BuyerReference> <cac:AccountingSupplierParty> <cac:Party> <cbc:EndpointID schemeID="9918">DE16520503531004885412</cbc:EndpointID> <cac:PostalAddress> <cbc:StreetName>Teichstr. 15</cbc:StreetName> <cbc:CityName>Berlin</cbc:CityName> <cbc:PostalZone>10232</cbc:PostalZone> <cac:Country> <cbc:IdentificationCode>DE</cbc:IdentificationCode> </cac:Country> </cac:PostalAddress> <cac:PartyTaxScheme> <cbc:CompanyID>279247134</cbc:CompanyID> <cac:TaxScheme> <cbc:ID>FC</cbc:ID> </cac:TaxScheme> </cac:PartyTaxScheme> <cac:PartyLegalEntity> <cbc:RegistrationName>PC Service GmbH</cbc:RegistrationName> <cbc:CompanyID>279247134</cbc:CompanyID> </cac:PartyLegalEntity> <cac:Contact> <cbc:Name>Max Siebert</cbc:Name> <cbc:Telephone>0312424323</cbc:Telephone> <cbc:ElectronicMail>max.siebert@pc-service-berlin.de</cbc:ElectronicMail> </cac:Contact> </cac:Party> </cac:AccountingSupplierParty> <cac:AccountingCustomerParty> <cac:Party> <cbc:EndpointID schemeID="9930">DE279247134</cbc:EndpointID> <cac:PostalAddress> <cbc:StreetName>Bergstr. 25</cbc:StreetName> <cbc:CityName>Frankfurt</cbc:CityName> <cbc:PostalZone>54632</cbc:PostalZone> <cbc:CountrySubentity>Hessen</cbc:CountrySubentity> <cac:Country> <cbc:IdentificationCode>DE</cbc:IdentificationCode> </cac:Country> </cac:PostalAddress> <cac:PartyLegalEntity> <cbc:RegistrationName>DB Service GmbH</cbc:RegistrationName> <cbc:CompanyID>DE279247134</cbc:CompanyID> </cac:PartyLegalEntity> </cac:Party> </cac:AccountingCustomerParty> <cac:Delivery> <cbc:ActualDeliveryDate>2024-02-24</cbc:ActualDeliveryDate> </cac:Delivery> <cac:PaymentMeans> <cbc:PaymentMeansCode>42</cbc:PaymentMeansCode> <cac:PayeeFinancialAccount> <cbc:ID>DE13520503531004885466</cbc:ID> <cbc:Name>Viktor Settel</cbc:Name> <cac:FinancialInstitutionBranch> <cbc:ID>HELADEF1KAS</cbc:ID> </cac:FinancialInstitutionBranch> </cac:PayeeFinancialAccount> </cac:PaymentMeans> <cac:TaxTotal> <cbc:TaxAmount currencyID="EUR">204.06</cbc:TaxAmount> <cac:TaxSubtotal> <cbc:TaxableAmount currencyID="EUR">1074.00</cbc:TaxableAmount> <cbc:TaxAmount currencyID="EUR">204.06</cbc:TaxAmount> <cac:TaxCategory> <cbc:ID>S</cbc:ID> <cbc:Percent>19.00</cbc:Percent> <cac:TaxScheme> <cbc:ID>VAT</cbc:ID> </cac:TaxScheme> </cac:TaxCategory> </cac:TaxSubtotal> </cac:TaxTotal> <cac:LegalMonetaryTotal> <cbc:LineExtensionAmount currencyID="EUR">1074.00</cbc:LineExtensionAmount> <cbc:TaxExclusiveAmount currencyID="EUR">1074.00</cbc:TaxExclusiveAmount> <cbc:TaxInclusiveAmount currencyID="EUR">1278.06</cbc:TaxInclusiveAmount> <cbc:AllowanceTotalAmount currencyID="EUR">0.00</cbc:AllowanceTotalAmount> <cbc:ChargeTotalAmount currencyID="EUR">0.00</cbc:ChargeTotalAmount> <cbc:PrepaidAmount currencyID="EUR">0.00</cbc:PrepaidAmount> <cbc:PayableRoundingAmount currencyID="EUR">0.00</cbc:PayableRoundingAmount> <cbc:PayableAmount currencyID="EUR">1278.06</cbc:PayableAmount> </cac:LegalMonetaryTotal> <cac:InvoiceLine> <cbc:ID>1</cbc:ID> <cbc:InvoicedQuantity unitCode="C62">2.000000</cbc:InvoicedQuantity> <cbc:LineExtensionAmount currencyID="EUR">934.00</cbc:LineExtensionAmount> <cac:Item> <cbc:Name>PC Fujitsu TX-23</cbc:Name> <cac:ClassifiedTaxCategory> <cbc:ID>S</cbc:ID> <cbc:Percent>19.00</cbc:Percent> <cac:TaxScheme> <cbc:ID>VAT</cbc:ID> </cac:TaxScheme> </cac:ClassifiedTaxCategory> </cac:Item> <cac:Price> <cbc:PriceAmount currencyID="EUR">467.000000</cbc:PriceAmount> </cac:Price> </cac:InvoiceLine> <cac:InvoiceLine> <cbc:ID>2</cbc:ID> <cbc:InvoicedQuantity unitCode="C62">2.000000</cbc:InvoicedQuantity> <cbc:LineExtensionAmount currencyID="EUR">140.00</cbc:LineExtensionAmount> <cac:Item> <cbc:Name>PC Installation</cbc:Name> <cac:ClassifiedTaxCategory> <cbc:ID>S</cbc:ID> <cbc:Percent>19.00</cbc:Percent> <cac:TaxScheme> <cbc:ID>VAT</cbc:ID> </cac:TaxScheme> </cac:ClassifiedTaxCategory> </cac:Item> <cac:Price> <cbc:PriceAmount currencyID="EUR">70.000000</cbc:PriceAmount> </cac:Price> </cac:InvoiceLine> </ubl:Invoice>
| ubl - Universal Business Language, частный случай XML. Просто выпечатывать в текстовый файл из-под DOSa -- будут проблемы с ESC. Времени на нормальную портировку на Винду и Harbour у меня нет -- шеф хочет, чтобы я сделал всё до конца июня. А прога там огромная -- на 2,5 мега одних исходников. Портировка займет в лучшем случае год.
|
|
|
|
|
| moderator
|
Пост N: 1611
Зарегистрирован: 06.07.06
|
|
Отправлено: 17.05.24 15:42. Заголовок: Dr. Oldwarez пишет: ..
Dr. Oldwarez пишет: цитата: | Просто выпечатывать в текстовый файл из-под DOSa -- будут проблемы с ESC |
| Какие проблемы с ESC?
|
|
|
|
| постоянный участник
|
Пост N: 4573
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.05.24 16:50. Заголовок: Dr. Oldwarez пишет н..
Dr. Oldwarez пишет цитата: | но как это сделать в ДОСявом Клиппере? |
| Как всегда в clipper, делаете txt файл[ы] структуры документов xml со всеми тэгами, в них выражения для данных. Читаете построчно и выделяете выражение в тэге, выполняете его, результат на выход в тэг. Например вариант Скрытый текст
<?xml version="1.0" encoding="Utf-8"?> <Document-Invoice> <Document-Header> <DocumentReceiveDateTime>^mDtoS(Date(), "-")+"T"+Time()</DocumentReceiveDateTime> <DocumentProcessDateTime>^-</DocumentProcessDateTime> <DocumentID>^-</DocumentID> <DocumentUID>^-</DocumentUID> <DocumentType>INVOICE</DocumentType> <DocumentSource>W</DocumentSource> <OriginalFileName>^-</OriginalFileName> </Document-Header> <Invoice-Header> <InvoiceNumber>^AllTrim(NR_2)+AllTrim(NR_1)</InvoiceNumber> <InvoiceDate>^OH_2</InvoiceDate> <InvoiceCurrency>^OH_3</InvoiceCurrency> <InvoicePaymentDueDate>^mDtoS(Date()+10, "-")</InvoicePaymentDueDate> <InvoicePaymentTerms>10</InvoicePaymentTerms> <InvoicePostDate>^-</InvoicePostDate> <DocumentFunctionCode>O</DocumentFunctionCode> <DocumentNameCode>380</DocumentNameCode> <Order> <BuyerOrderNumber>^OH_1</BuyerOrderNumber> <BuyerOrderDate>^OH_2</BuyerOrderDate> <SellerOrderNumber>^-</SellerOrderNumber> </Order> <Delivery> <DeliveryLocationNumber>^OP_9</DeliveryLocationNumber> <CodeBySeller>^-</CodeBySeller> <CodeByBuyer>^-</CodeByBuyer> <Name>^-</Name> <StreetAndNumber>^-</StreetAndNumber> <CityName>^-</CityName> <Country>^-</Country> <DeliveryDate>^mDtoS(Date()+10, "-")</DeliveryDate> <DespatchNumber>^AllTrim(NR_2)+AllTrim(NR_1)</DespatchNumber> </Delivery> </Invoice-Header> <Document-Parties> <Sender> <ILN>^OP_6</ILN> </Sender> <Receiver> <ILN>^OP_1</ILN> </Receiver> <Creator> <SystemUniqueCode>^-</SystemUniqueCode> <Name>^-</Name> <E-mail>^-</E-mail> <CreationType>^-</CreationType> </Creator> </Document-Parties> <Invoice-Parties> <Buyer> <ILN>^OP_1</ILN> <TaxID>^-</TaxID> <CodeBySeller>^-</CodeBySeller> <UtilizationRegisterNumber>^-</UtilizationRegisterNumber> <Name>^-</Name> <StreetAndNumber>^-</StreetAndNumber> <CityName>^-</CityName> <PostalCode>^-</PostalCode> <Country>^-</Country> </Buyer> <Payer> <ILN>^OP_1</ILN> <TaxID>^-</TaxID> <CodeBySeller>^-</CodeBySeller> <CodeByBuyer>^-</CodeByBuyer> <UtilizationRegisterNumber>^-</UtilizationRegisterNumber> <Name>^-</Name> <StreetAndNumber>^-</StreetAndNumber> <CityName>^-</CityName> <PostalCode>^-</PostalCode> <Country>^-</Country> </Payer> <Invoicee> <ILN>^OP_1</ILN> <TaxID>^-</TaxID> <CodeBySeller>^-</CodeBySeller> <CodeByBuyer>^-</CodeByBuyer> <UtilizationRegisterNumber>^-</UtilizationRegisterNumber> <Name>^-</Name> <StreetAndNumber>^-</StreetAndNumber> <CityName>^-</CityName> <PostalCode>^-</PostalCode> <Country>^-</Country> </Invoicee> <Seller> <ILN>^OP_6</ILN> <TaxID>^-</TaxID> <CodeBySeller>^-</CodeBySeller> <CodeByBuyer>^-</CodeByBuyer> <UtilizationRegisterNumber>^-</UtilizationRegisterNumber> <Name>^-</Name> <StreetAndNumber>^-</StreetAndNumber> <CityName>^-</CityName> <PostalCode>^-</PostalCode> <Country>^-</Country> <OperatorDetails> <Name>^-</Name> <TelephoneNumber>^-</TelephoneNumber> <E-mail>^-</E-mail> </OperatorDetails> </Seller> <Payee> <ILN>^OP_6</ILN> <TaxID>^-</TaxID> <AccountNumber>^-</AccountNumber> <UtilizationRegisterNumber>^-</UtilizationRegisterNumber> <CodeBySeller>^-</CodeBySeller> <CodeByBuyer>^-</CodeByBuyer> <Name>^-</Name> <StreetAndNumber>^-</StreetAndNumber> <CityName>^-</CityName> <Country>^-</Country> </Payee> </Invoice-Parties> <Invoice-Lines> <Line> <Line-Item> <LineNumber>^u2s(LN_1)</LineNumber> <EAN>^AllTrim(LN_2)</EAN> <SupplierItemCode>^-</SupplierItemCode> <ItemDescription>^LN_13</ItemDescription> <InvoiceQuantity>^iif(empty(LN_14), LN_7, LN_14)</InvoiceQuantity> <InvoiceUnitNetPrice>^iif(empty(LN_15), LN_10, LN_15)</InvoiceUnitNetPrice> <UnitOfMeasure>^LN_24</UnitOfMeasure> <InvoicedUnitPackSize>^-</InvoicedUnitPackSize> <TaxRate>^LN_22</TaxRate> <TaxCategoryCode>S</TaxCategoryCode> <TaxAmount>^LN_23</TaxAmount> <NetAmount>^iif(empty(LN_16), LN_11, LN_16)</NetAmount> </Line-Item> <Line-Delivery> <DeliveryLocationNumber>^OP_9</DeliveryLocationNumber> <CodeByBuyer>^-</CodeByBuyer> <Name>^-</Name> <DeliveryDate>^mDtoS(Date()+10, "-")</DeliveryDate> <DespatchNumber>^AllTrim(NR_2)+AllTrim(NR_1)</DespatchNumber> </Line-Delivery> <Line-AdditionalInformation> <CountryOfOrigin>^-</CountryOfOrigin> </Line-AdditionalInformation> </Line> </Invoice-Lines> <Invoice-Summary> <TotalLines>^OS_7</TotalLines> <TotalNetAmount>^OS_6</TotalNetAmount> <TotalTaxAmount>^OS_4</TotalTaxAmount> <TotalRounding>^-</TotalRounding> <TotalGrossAmount>^OS_6+OS_4</TotalGrossAmount> <Tax-Summary> <Tax-Summary-Line> <TaxRate>^OS_5</TaxRate> <TaxCategoryCode>S</TaxCategoryCode> <TaxAmount>^OS_4</TaxAmount> <TaxableAmount>^OS_6</TaxableAmount> </Tax-Summary-Line> </Tax-Summary> </Invoice-Summary> </Document-Invoice>
| Секцию строк документа <Invoice-Lines>...</Invoice-Lines>, выделена цветом читаете в цикле на документостроки своих документов. Строки с "^-" в тэгах могут быть выкинуты вместе с тэгами или делаться пустыми по вашей ситуации, например <CodeByBuyer>^-</CodeByBuyer> на выход может давать <CodeByBuyer></CodeByBuyer> или не давать тэг на выход целиком. NR_2, ..., OH_2, ..., OP_1, ..., LN_16, LN_11, ..., OS_4, OS_6 ... - это поля dbf
|
|
|
|
| Администратор
|
Пост N: 4173
Зарегистрирован: 23.05.05
|
|
Отправлено: 17.05.24 18:56. Заголовок: Dr. Oldwarez пишет: ..
Dr. Oldwarez пишет: цитата: | Это хорошо, но как это сделать в ДОСявом Клиппере? |
| Но вот зачем эти мучения ? Не проще ли пересобрать клиппер-программу под терминальное 32-х битное приложение Харбор, которое прекрасно будет работать под winxp и старше ? И сразу же откроется целый новый мир, в том числе работа с xml, и много чего еще ? И ads там поддерживается
|
|
|
|
| |
Пост N: 342
Зарегистрирован: 05.10.06
|
|
Отправлено: 17.05.24 21:48. Заголовок: Pasha пишет: Но вот..
Pasha пишет: цитата: | Но вот зачем эти мучения ? Не проще ли пересобрать клиппер-программу под терминальное 32-х битное приложение Харбор, которое прекрасно будет работать под winxp и старше ? И сразу же откроется целый новый мир, в том числе работа с xml, и много чего еще ? И ads там поддерживается |
| Если прога большая, то на начальном этапе, можно собрать и отдельные модули на Харборе, которые решают локальные задачи и вызывать их из основной
|
|
|
|