papyrussolution / OpenPapyrus

Sophisticated ERP, CRM, Point-Of-Sale, etc. Open source now. This system is developed since 1996.
http://www.petroglif.ru
Other
239 stars 66 forks source link

What font does it support? #6

Open minhtri22 opened 5 years ago

minhtri22 commented 5 years ago

font I used windows 10 64bit

jmalkema commented 5 years ago

Hello Sobolev,

To understand you program better I saved papyrus.vcproj to other name in vmware Win10 environment. I get problems with Crystal reports. I put the Crystal reports code under compiler switch.

1>..\PPLib\ppreport.cpp(477): error C2061: syntax error: identifier 'PEExportOptions' 1>..\PPLib\v_report.cpp(662): error C2065: 'PE_ERR_ERRORINDATABASEDLL': undeclared identifier 1>..\PPMain\Ppmain.cpp(272): error C3861: 'PEOpenEngine': identifier not found 1>..\PPLib\ppserver.cpp(1859): error C3861: 'PECloseEngine': identifier not found 1>ppifc_i.c 1>c1 : fatal error C1083: Cannot open source file: '..\Rsrc\dl600\ppifc_i.c': No such file or directory

I can compile main gui program and analyse btrieve. If i understand btrieve i will migrate it to Mysql.

I'm impressed with your diagram. I've printed it and be trying to understand.

diagram is for explaining idea´s and to make it better design.

You have made a big work endeavouring to explain your vision of the system here and at the forum. Neverthless i can't gather all your ideas together.

AI tensor flow is more experimental. AI can classificate objects out of picture nowadays. The challenge is to give advise about transactions. By running trained TensorFlow models in an ERP application. ERP Transactions can be bank transaction, but can be blockchain (smart-contracts) transactions too. I have specific Nvidea hardware for AI en Blockchain experimenting. Important is the use of Nvidea (Linux) containers. Vmware can not use GPU tensorcore.

In my opinion you can see an ERP application in two views. The normal business user view and the data science engineer (“Business analist”) view. I think it is only redesign of the main menu. A lot of analyses and reports are in R. There is a lot of beautiful R code of third persons. It is more a statistical analysis platform.

Microsoft R Open is the enhanced distribution of R from Microsoft Corporation. It is a complete open source platform for statistical analysis and data science.

What You Can Expect from R R is a language! You do data analysis by writing functions and scripts, not by pointing and clicking. That may sound daunting if you are new to programming, but R is an easy language to learn, and a very natural and expressive one for data analysis. Working with R is an interactive experience that encourages experimentation, exploration and play. It is likely that whatever your area of interest, you will find R packages(libraries of functions) that will be immediately helpful. And, of course, R is renowned for its capabilities to visualize data.

The problems is often in the detail. I haven’t looked how easy i can integrate it with "Microsoft R Open".

Can you explain shortly here main streaks of your vision.

The opposite of (Napster Architecture of) Facebook, AirBnb, Uber, Ebay, etc. You put in your products and service you can offer or want to collect. You synchonize with your friends. Your friends synchonize with their friends. This will result in a total network. (Everyone is linkt to everybody else by their friends).

Such as: target users, target business, killer features and so on. I beg pardon if you have allready described it.

Target users are i think self-employed people. But health care could be a business scenario too. A lot of money of a person is spend on heath care. Beter collaboration between health care workers could be killer feature.

How many self-employed people are there in the Netherlands? According to figures from Statistics Netherlands and the Business Dynamics 2018 report (Chamber of Commerce), the Netherlands had over 1.9 million companies on 1 January 2019. This also includes entrepreneurs with employees. Of the total number of entrepreneurs, 1,237,734 were self-employed on 1 January 2019 (both full-time and part-time).

Healthcare costs rise to a record amount of 100 billion euros in the Netherlands. In total, 5.805 euro of care was spent per person in 2018 via the government, insurance and personal payments, the CBS writes. An increase of 140 euros compared to the spending in 2017.

Probably, i couldn't perceive it properly.

I made a diagram of the QT-solution also. The friend-to-friend (or F2F) is better implemented in RetroShare part:

OpenPapyrus_QT-gui_0022

Sobolev, Do you use SOAP for communication (products/price list) between OpenPapyrus companies?

Greetings Jan Marco

papyrussolution commented 5 years ago

Hello, Jan. I'll be trying to answer partly. -- SOAP is used in project intensly for interaction between companies. You can find worked examples at the folder SOAP of the VS-solution. We utilize gSOAP subsysem (with own modifications). -- Migration to SQL-dbms isn't easy task because Papyrus uses low-level access to a database. On the other hand, i have already made the most deal of the work several years ago. I had been working on the migration to Oracle DBMS. You can see class DbProvider at db.h and derived classes BDictionary (used as a main way for access to the db) and SOraDbProvider.

Greetings, Anton Sobolev. Will be back soon in order to answer other questions.

papyrussolution commented 5 years ago

-- Header file "Src\Include\CRPE.H" declares PEExportOptions and other problem symbols has been mentioned by you at the firsts question. This is a "native" CrystalReports's file.

jmalkema commented 5 years ago

Hello Sobolev,

SOAP is used in project intensly for interaction between companies. You can find worked examples at the folder SOAP of the VS-solution. We utilize gSOAP subsysem (with own modifications).

I am very curious how it works, i will look at examples :-)

Migration to SQL-dbms isn't easy task because Papyrus uses low-level access to a database.

I have to analyse how it works. N.B. Maybe could help rewrite low-level- to higher level access.

On the other hand, i have already made the most deal of the work several years ago. I had been working on the migration to Oracle DBMS. You can see class DbProvider at db.h and derived classes BDictionary (used as a main way for access to the db) and SOraDbProvider.

I like to reuse existing (Oracle) code.

After analyse how database communications works. Maybe I try migrate to ('SMysqlDbProvider') MySQL as Proof of Concept tables `Phonebook´ and ´Product´ only. I think the most important tables for testing. I will learn (i hope) how your gui program works. If your beautiful gui works the synchonization in friend-to-friend (or F2F) environment is next challange.

I have found product csv file of an IT hardware store Azerty as test example (138976 product records of type): artno|sku|brand|name|price_inc|price_ex|url|ean|firstimage|offlinestock|days 410213|CMZ8GX3M2A1600C9R|CORSAIR|"Vengeance - DDR3 - 8 GB : 2 x 4 GB - DIMM 240-pins - 1600 MHz / PC3-12800 - CL9 - 1.5 V"|44,05|36,40|https://azerty.nl/product/corsair/410213/vengeance-ddr3-8-gb--2-x-4-gb|0843591014120|http://d9qiof14roash.cloudfront.net/tl_assets/257974_Azerty01.jpg|0|"2-3 werkdagen"

Other IT hardware stores will sell same product with different price and place. The place can be retrieved out of Phonebook table.

The last OpenPapyrus source code gives error on ´sttResortАee´ at my environment: 10>D:\pinnode\server\OpenPapyrus\Src\include\pp.h(13758): error C3872: '0x90': this character is not allowed in an identifier (compiling source file ..\Db\dbsql.cpp) 10>D:\pinnode\server\OpenPapyrus\Src\include\pp.h(13758): error C3872: '0x90': this character is not allowed in an identifier (compiling source file ..\SLib\vtbutton.cpp) 10>D:\pinnode\server\OpenPapyrus\Src\include\pp.h(13758): error C3872: '0x90': this character is not allowed in an identifier (compiling source file ..\SLib\usb.cpp)

Synccash.cpp
int SLAPI SCS_SYNCCASH::PrintCheck(CCheckPacket * pPack, uint flags)
case CCheckPacket::sttResortАee: str_id = DVCPARAM_STT_RESORTAEE; break;

//@erikC v10.4.12{
enum SubjTermTag {
    sttAmountMerchantFee      = 17, // STT_AMOUNTMERCHANTFEE   о суммах уплаченного торгового сбора
    .
    .
    //sttResortАee              = 18,   // STT_RESORTAEE       о курортном сборе
    sttDeposit                = 19, // STT_DEPOSIT  Залог       
};

Greetings Jan Marco

papyrussolution commented 5 years ago

Hello, Jan. must be sttResortFee. I've fixed it up, but fancy how my compiler has been working on the utf-8 symbol in enum member. New codes will be commited in a pair days. Thank you for pointing to the error. I wonder how we can consolidate our efforts for solving problem of the migration to mysql. I'm deprivated of the time because the "bloody enterprise" business devours a lot of it. But this migration is the necessary thing and i'm gratitude to you for urging me in this direction. ps. i'm going on the work upon translation russian texts to metasymbols. There are about 2500 strings in ppw.rc left. Not so much quick :(

jmalkema commented 5 years ago

Hello Sobolev,

ps. i'm going on the work upon translation russian texts to metasymbols. There are about 2500 strings in ppw.rc left. Not so much quick :(

2500 strings is a lot by hand.

I will try to parser the ppw.rc resource file to Mysql:

nameID DIALOGEX x, y, width, height [ , helpID] [optional-statements] {control-statements}

My conform zone is C and will be my first try. I am beginning to learn Python. Maybe later in Python as Proof Of Concept.

This is my suggested process flow: ppw_rc_0001

The DIALOGEX structures in ppw.rc

table_dialogex

RFTL = read_first_token_line() if RFTL == "" { } else { RSTL = read_next_token_line() if RSTL == "DIALOGEX" { nameID = RFTL x = read_next_token_line() y = read_next_token_line() width = read_next_token_line() hight = read_next_token_line() RFTL = read_first_token_line() if RFTL == "STYLE" { style = read_next_all_token_line() }
RFTL = read_first_token_line() if RFTL == "CAPTION" { text1 = read_next_token_line() }
RFTL = read_first_token_line() if RFTL == "FONT" { pointsize = read_next_token_line() typeface = read_next_token_line() weight = read_next_token_line() italic = read_next_token_line() charset = read_next_token_line() } write_record_to_mysql("dialogex", nameID, x, y, width, hight, style, text1, pointsize, typeface, weight, italic, charset)
RFTL = read_first_token_line() if RFTL == "BEGIN" { i = 0 do {
RFTL = read_first_token_line() switch (RFTL) {
case "COMBOBOX": //COMBOBOX id, x, y, width, height [, style [, extended-style]] text1 = "" class = "" id = read_next_token() x = read_next_token() y = read_next_token() width = read_next_token() height = read_next_token()
style = read_next_token_optional()
extended-style = read_next_token_optional()
break;
case "CONTROL":
//CONTROL text, id, class, style, x, y, width, height [, extended-style]
text1 = read_next_token() id = read_next_token() class = read_next_token() style = read_next_token()
x = read_next_token() y = read_next_token() width = read_next_token() height = read_next_token()
extended-style = read_next_token_optional()
break;
case "CTEXT": //CTEXT text, id, x, y, width, height [, style [, extended-style]] class = "" text1 = read_next_token() id = read_next_token()
x = read_next_token() y = read_next_token() width = read_next_token() height = read_next_token()
style = read_next_token_optional()
extended-style = read_next_token_optional() break;
case "END": break; case "DEFPUSHBUTTON": //DEFPUSHBUTTON text, id, x, y, width, height [, style [, extended-style]] class = "" text1 = read_next_token() id = read_next_token()
x = read_next_token() y = read_next_token() width = read_next_token() height = read_next_token()
style = read_next_token_optional()
extended-style = read_next_token_optional()
break;
case "EDITTEXT":
//EDITTEXT id, x, y, width, height [, style [, extended-style]]
text1 = "" class = "" id = read_next_token()
x = read_next_token() y = read_next_token() width = read_next_token() height = read_next_token()
style = read_next_token_optional()
extended-style = read_next_token_optional()
break;
case "GROUPBOX": //GROUPBOX text, id, x, y, width, height [, style [, extended-style]] class = "" text1 = read_next_token() id = read_next_token()
x = read_next_token() y = read_next_token() width = read_next_token() height = read_next_token() style = read_next_token_optional()
extended-style = read_next_token_optional() break;
case "ICON": //ICON text, id, x, y [, width, height, style [, extended-style]] class = ""
text1 = read_next_token() id = read_next_token()
x = read_next_token() y = read_next_token() width = read_next_token_optional() height = read_next_token_optional()
style = read_next_token_optional()
extended-style = read_next_token_optional()
break;
case "LISTBOX": //LISTBOX id, x, y, width, height [, style [, extended-style]] text1 = "" class = "" id = read_next_token()
x = read_next_token() y = read_next_token() width = read_next_token() height = read_next_token()
style = read_next_token_optional()
extended-style = read_next_token_optional()
break; case "LTEXT": //LTEXT text, id, x, y, width, height [, style [, extended-style]] class = "" text1 = read_next_token() id = read_next_token()
x = read_next_token() y = read_next_token() width = read_next_token_optional() height = read_next_token_optional()
style = read_next_token_optional()
extended-style = read_next_token_optional()
break;
case "PUSHBUTTON":
//PUSHBUTTON text, id, x, y, width, height [, style [, extended-style]]
class = "" text1 = read_next_token() id = read_next_token()
x = read_next_token() y = read_next_token() width = read_next_token_optional() height = read_next_token_optional()
style = read_next_token_optional()
extended-style = read_next_token_optional()
default : print RFTL is not found break; } if RFTL != "END" { write_record_to_mysql("dialogexFormat", nameID, i, text1, id, class, style, extended-style, x, y, width, height) i++ } } while RFTL != "END"

     }
}

}

Greetings Jan Marco

jmalkema commented 5 years ago

Hello Sobolev,

Today I have looked at MySQL database structure for DIALOGEX of ppw.rc:

ppw_dialogex

CREATE TABLE IF NOT EXISTS textLanguageReference ( SN bigint(15) not null AUTO_INCREMENT comment 'serial number of record', TS timestamp not null comment 'timestamp of record', textLanguageReferenceId tinyblob comment 'reference text (@identifier)', textLanguageReferenceText tinyblob comment 'reference English text',
primary key (SN), unique key (textLanguageReferenceId(33))
) ENGINE = InnoDB DEFAULT CHARSET = utf8;

CREATE TABLE IF NOT EXISTS textLanguage ( SN bigint(15) not null AUTO_INCREMENT comment 'serial number of record', TS timestamp not null comment 'timestamp of record', textLanguage enum('Dutch', 'English', 'German', 'Russian') not null default 'English',
textLanguageId tinyblob comment 'reference text (@identifier)', textLanguageTextRefEnglish tinyblob comment 'reference English text',
textLanguageText tinyblob comment 'local country text', index (textLanguage, textLanguageId(33)), primary key (SN) ) ENGINE = InnoDB DEFAULT CHARSET = utf8;

write_record_to_mysql("dialogex", nameID, x, y, width, hight, style, text1, pointsize, typeface, weight, italic, charset)

CREATE TABLE IF NOT EXISTS dialogex ( SN bigint(15) not null AUTO_INCREMENT comment 'serial number of record', TS timestamp not null comment 'timestamp of record', dialogexNameID tinyblob comment 'dialogex identifier', dialogexX bigint(15) comment 'x coordinate of dialogex', dialogexY bigint(15) comment 'y coordinate of dialogex', dialogexWidth bigint(15) comment 'width of dialogex', dialogexHeight bigint(15) comment 'height of dialogex', dialogexStyle blob comment 'style of dialogex', dialogexText1 tinyblob comment 'reference text (@identifier) of dialogex',
dialogexText2 tinyblob comment 'local country text of dialogex',
dialogexPointsize bigint(15) comment 'height of dialogex', dialogexTypeface tinyblob comment 'class name of dialogex', dialogexWeight bigint(15) comment 'height of dialogex', dialogexItalic bigint(15) comment 'class name of dialogex', dialogexCharset tinyblob comment 'class name of dialogex', primary key (SN), unique key (dialogexNameID(33))
) ENGINE = InnoDB DEFAULT CHARSET = utf8;

write_record_to_mysql("dialogexfield", nameID, i, text1, id, class, style, extended-style, x, y, width, height)

CREATE TABLE IF NOT EXISTS dialogexfield ( SN bigint(15) not null AUTO_INCREMENT comment 'serial number of record', TS timestamp not null comment 'timestamp of record', dialogexfieldNameID tinyblob comment 'dialogex identifier', dialogexfieldI bigint(15) comment 'sequence number of controlName', dialogexfieldControlName enum('COMBOBOX', 'CONTROL', 'CTEXT', 'DEFPUSHBUTTON', 'EDITTEXT', 'GROUPBOX', 'ICON', 'LISTBOX', 'LTEXT', 'PUSHBUTTON') not null default 'LTEXT',
dialogexfieldText1 tinyblob comment 'reference text (@identifier) of controlName', dialogexfieldText2 tinyblob comment 'local country text of controlName',
dialogexfieldId tinyblob comment 'identifier of controlName', dialogexfieldClassName tinyblob comment 'class name of controlName',
dialogexfieldStyle blob comment 'style of controlName',
dialogexfieldExtendedStyle blob comment 'extented style of controlName',
dialogexfieldX bigint(15) comment 'x coordinate of controlName', dialogexfieldY bigint(15) comment 'y coordinate of controlName', dialogexfieldWidth bigint(15) comment 'width of controlName', dialogexfieldHeight bigint(15) comment 'height of controlName', primary key (SN), unique key (dialogexfieldId(33))
) ENGINE = InnoDB DEFAULT CHARSET = utf8;

INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@appellation', 'Name'); INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@asstwroffgrp_code', 'Depreciation code'); INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@asstwroffgrp_limit', 'Limit residual value, %'); INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@asstwroffgrp_wroffterm', 'Full write-off period, months'); INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@asstwroffgrp_wrofftype', 'Write-off scheme'); INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@but_cancel', 'Cancel'); INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@but_ok', 'Ok'); INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@id', 'Id');

INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@appellation', 'Name');

INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Dutch', '@appellation', 'Name', 'Naam'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'English', '@appellation', 'Name', 'Name'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'German', '@appellation', 'Name', 'name'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Russian', '@appellation', 'Name', 'Наименование');

INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@asstwroffgrp_code', 'Depreciation code');

INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Dutch', '@asstwroffgrp_code', 'Depreciation code', 'Afschrijvings code'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'English', '@asstwroffgrp_code', 'Depreciation code', 'Depreciation code'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'German', '@asstwroffgrp_code', 'Depreciation code', 'Abschreibungscode'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Russian', '@asstwroffgrp_code', 'Depreciation code', 'Код нормы амортизации');

INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@asstwroffgrp_limit', 'Limit residual value, %');

INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Dutch', '@asstwroffgrp_limit', 'Limit residual value, %', 'Limiet restwaarde, %'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'English', '@asstwroffgrp_limit', 'Limit residual value, %', 'Limit residual value, %'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'German', '@asstwroffgrp_limit', 'Limit residual value, %', 'Restwert begrenzen, %'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Russian', '@asstwroffgrp_limit', 'Limit residual value, %', 'Предельная остаточная стоимость, %');

INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@asstwroffgrp_wroffterm', 'Full write-off period, months');

INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Dutch', '@asstwroffgrp_wroffterm', 'Full write-off period, months', 'Volledige afschrijvingsperiode, maanden'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'English', '@asstwroffgrp_wroffterm', 'Full write-off period, months', 'Full write-off period, months'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'German', '@asstwroffgrp_wroffterm', 'Full write-off period, months', 'Vollständige Abschreibungsfrist, Monate'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Russian', '@asstwroffgrp_wroffterm', 'Full write-off period, months', 'Период полного списания, мес');

INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@asstwroffgrp_wrofftype', 'Write-off scheme');

INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Dutch', '@asstwroffgrp_wrofftype', 'Write-off scheme', 'Afschrijvingsregeling'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'English', '@asstwroffgrp_wrofftype', 'Write-off scheme', 'Write-off scheme'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'German', '@asstwroffgrp_wrofftype', 'Write-off scheme', 'Abschreibungsschema'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Russian', '@asstwroffgrp_wrofftype', 'Write-off scheme', 'Схема списания');

INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@but_cancel', 'Cancel');

INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Dutch', '@but_cancel', 'Cancel', 'Annuleren'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'English', '@but_cancel', 'Cancel', 'Cancel'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'German', '@but_cancel', 'Cancel', 'Abbrechen'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Russian', '@but_cancel', 'Cancel', 'Отмена');

INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@but_ok', 'Ok');

INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Dutch', '@but_ok', 'Ok', 'OK'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'English', '@but_ok', 'Ok', 'Ok'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'German', '@but_ok', 'Ok', 'Okay'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Russian', '@but_ok', 'Ok', 'OK');

INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@id', 'Id');

INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Dutch', '@id', 'Id', 'Id'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'English', '@id', 'Id', 'Id'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'German', '@id', 'Id', 'Id'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Russian', '@id', 'Id', 'ИД');

INSERT INTO dialogex (TS, dialogexNameID, dialogexX, dialogexY, dialogexWidth, dialogexHeight, dialogexStyle, dialogexText1, dialogexText2, dialogexPointsize, dialogexTypeface, dialogexWeight, dialogexItalic, dialogexCharset) VALUES (NOW(), 'DLG_AWOG', 67, 16, 202, 175, 'DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU', 'Группа списания', '', 8, 'MS Sans Serif', 0, 0, '0x0');

INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG', 0, 'LTEXT', '@appellation', '', '4001', '', '', '', 10, 10, 52, 8); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG', 1, 'EDITTEXT', '', '', 'CTL_AWOG_NAME', '', 'ES_AUTOHSCROLL', '', 10, 20, 125, 13); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG', 2, 'LTEXT', '@id', '', '4002', '', '', '', 145, 10, 12, 8); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG', 3, 'EDITTEXT', '', '', 'CTL_AWOG_ID', '', 'ES_AUTOHSCROLL', '', 145, 20, 40, 13); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG', 4, 'LTEXT', '@asstwroffgrp_code', '', '4003', '', '', '', 10, 40, 88, 8); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG', 5, 'EDITTEXT', '', '', 'CTL_AWOG_CODE', '', 'ES_AUTOHSCROLL', '', 115, 40, 70, 13); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG', 6, 'GROUPBOX', '@asstwroffgrp_wrofftype', '', 'CTL_AWOG_SCHEME', '', 'WS_GROUP', '', 75, 60, 110, 45); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG', 7, 'CONTROL', 'Линейная амортизация', '', '5299', 'Button', 'BS_AUTORADIOBUTTON | BS_NOTIFY | WS_TABSTOP', '', 80, 70, 95, 10); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG', 8, 'CONTROL', 'Ускоренная амортизация', '', '9395', 'Button', 'BS_AUTORADIOBUTTON | BS_NOTIFY | WS_TABSTOP', '', 80, 80, 100, 10); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG', 9, 'CONTROL', 'Списание себестоимости', '', '13491', 'Button', 'BS_AUTORADIOBUTTON | BS_NOTIFY | WS_TABSTOP', '', 80, 90, 100, 10); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG',10, 'LTEXT', '@asstwroffgrp_wroffterm', '', '4005', '', '', '', 10, 115, 116, 8); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG',11, 'EDITTEXT', '', '', 'CTL_AWOG_TERM', '', 'ES_AUTOHSCROLL', '', 140, 115, 40, 13); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG',12, 'LTEXT', '@asstwroffgrp_limit', '', '4006', '', '', '', 10, 130, 130, 8); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG',13, 'EDITTEXT', '', '', 'CTL_AWOG_LIMIT', '', 'ES_AUTOHSCROLL', '', 140, 130, 40, 13); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG',14, 'DEFPUSHBUTTON', '@but_ok', '', 'STDCTL_OKBUTTON', '', '', '', 85, 155, 50, 13); INSERT INTO dialogexfield (TS, dialogexfieldNameID, dialogexfieldI, dialogexfieldControlName, dialogexfieldText1, dialogexfieldText2, dialogexfieldId, dialogexfieldClassName, dialogexfieldStyle, dialogexfieldExtendedStyle, dialogexfieldX, dialogexfieldY, dialogexfieldWidth, dialogexfieldHeight) VALUES (NOW(), 'DLG_AWOG',15, 'PUSHBUTTON', '@but_cancel', '', 'STDCTL_CANCELBUTTON', '', '', '', 140, 155, 50, 13);

Greetings Jan Marco

jmalkema commented 5 years ago

Hello Sobolev,

ps. i'm going on the work upon translation russian texts to metasymbols. There are about 2500 strings in ppw.rc left. Not so much quick :(

Today, I will start to make two C-programs: 1) Dialogex_to_mysql: Input file ppw_obs.rc with one Dialogex test resource structure. Program will parse these (Dialogex test resource) structure in MySQL. 2) Mysql_to_dialogex: Output file ppw_obs_out.rc will be created by building up "Dialogex resource structure" out of the MySQL (table) structure. Test: ppw_obs_out.rc should have same tokens as ppw_obs.rc

I am try hard to search for a C++ api for Google translate service. (translating-text, using-rest, quickstart, pricing)

Sobolev, Maybe you have advise for me for the Google translate connection?

Next is what I have tested by hand. In order to make automation of parsing ppw.rc easier:

Side effect could be the substituation of the Russian fixed 2500 strings in ppw.rc to @english-text-of-original-Russion-text :-)

I see in 'dialogexText1' (in table 'dialogex') 'Группа списания' without '@' character -> google translate english -> 'Write-off group' -> strip spaces -> '@Write-offgroup'

insert in textLanguageReference table:

INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@Write-offgroup', 'Write-off group');

Google translate to Dutch: 'Afschrijfgroep' Google translate to English: 'Write-off group' Google translate to German: 'Abschreibungsgruppe'

insert in textLanguage table:

INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Dutch', '@Write-offgroup', 'Write-off group', 'Afschrijfgroep'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'English', '@Write-offgroup', 'Write-off group', 'Write-off group'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'German', '@Write-offgroup', 'Write-off group', 'Abschreibungsgruppe'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Russian', '@Write-offgroup', 'Write-off group', 'Группа списания');

remove fixed language

UPDATE 'dialogex' SET 'dialogexText1' = '@Write-offgroup' WHERE dialogexNameID = 'DLG_AWOG' AND 'dialogexText1' = 'Группа списания';

I see in 'dialogexfieldText1' (in table 'dialogexfield') 'Линейная амортизация' without '@' character -> google translate english -> 'Linear depreciation' -> strip spaces -> '@Lineardepreciation'

INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@Lineardepreciation', 'Linear depreciation');

Google translate to Dutch: 'Lineaire afschrijving' Google translate to English: 'Linear depreciation' Google translate to German: 'Lineare Abschreibung'

insert in textLanguage table:

INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Dutch', '@Lineardepreciation', 'Linear depreciation', 'Lineaire afschrijving'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'English', '@Lineardepreciation', 'Linear depreciation', 'Linear depreciation'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'German', '@Lineardepreciation', 'Linear depreciation', 'Lineare Abschreibung'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Russian', '@Lineardepreciation', 'Linear depreciation', 'Линейная амортизация');

remove fixed language

UPDATE 'dialogexfield' SET 'dialogexfieldText1' = '@Lineardepreciation' WHERE dialogexfieldNameID = 'DLG_AWOG' AND 'dialogexfieldText1' = 'Линейная амортизация';

I see in 'dialogexfieldText1' (in table 'dialogexfield') 'Ускоренная амортизация' without '@' character -> google translate english -> 'Accelerated depreciation' -> strip spaces -> '@Accelerateddepreciation'

INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@Accelerateddepreciation', 'Accelerated depreciation');

Google translate to Dutch: 'Versnelde afschrijving' Google translate to English: 'Accelerated depreciation' Google translate to German: 'Beschleunigte Abschreibung'

insert in textLanguage table:

INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Dutch', '@Accelerateddepreciation', 'Accelerated depreciation', 'Versnelde afschrijving'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'English', '@Accelerateddepreciation', 'Accelerated depreciation', 'Accelerated depreciation'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'German', '@Accelerateddepreciation', 'Accelerated depreciation', 'Beschleunigte Abschreibung'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Russian', '@Accelerateddepreciation', 'Accelerated depreciation', 'Ускоренная амортизация');

remove fixed language

UPDATE 'dialogexfield' SET 'dialogexfieldText1' = '@Accelerateddepreciation' WHERE dialogexfieldNameID = 'DLG_AWOG' AND 'dialogexfieldText1' = 'Ускоренная амортизация';

I see in 'dialogexfieldText1' (in table 'dialogexfield') 'Списание себестоимости' without '@' character -> google translate english -> 'Write-off cost' -> strip spaces -> '@Write-offcost'

INSERT INTO textLanguageReference (TS, textLanguageReferenceId, textLanguageReferenceText) VALUES (NOW(), '@Write-offcost', 'Write-off cost');

Google translate to Dutch: 'Afschrijvingskosten' Google translate to English: 'Write-off cost' Google translate to German: 'Abschreibungskosten'

insert in textLanguage table:

INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Dutch', '@Write-offcost', 'Write-off cost', 'Afschrijvingskosten'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'English', '@Write-offcost', 'Write-off cost', 'Write-off cost'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'German', '@Write-offcost', 'Write-off cost', 'Abschreibungskosten'); INSERT INTO textLanguage (TS, textLanguage, textLanguageId, textLanguageTextRefEnglish, textLanguageText) VALUES (NOW(), 'Russian', '@Write-offcost', 'Write-off cost', 'Списание себестоимости');

remove fixed language

UPDATE 'dialogexfield' SET 'dialogexfieldText1' = '@Write-offcost' WHERE dialogexfieldNameID = 'DLG_AWOG' AND 'dialogexfieldText1' = 'Списание себестоимости';

Maybe, you have advise or better solution(s) :-)

Greetings Jan Marco

Some Mysql table contents: mysql_dialogex_02

papyrussolution commented 5 years ago

Hello, Jan. I'm still exploring your decision. I use microsoft translation service (not google's one). Papyrus contains code for this purpose. See class PPAutoTranslSvc_Microsoft (Src\PPLib\txtanlz.cpp). But there are used my own account parameters.

papyrussolution commented 5 years ago

You can see the usage of that autotranslation mechanism in StringStore2::Compile(const char pFileName, long flags, const char pTranslateToLang) (source file \Src\PPLib\Strstore.cpp).

jmalkema commented 5 years ago

Hello Sobolev,

StringStore2::Compile(const char pFileName, long flags, const char pTranslateToLang) (source file \Src\PPLib\Strstore.cpp).

Thanks a lot. You have made beautiful code. :-) I will try to use it.

papyrussolution commented 5 years ago

Thanks for the kind words.

jmalkema commented 5 years ago

Hello, Sobolev,

“Thanks for the kind words.”

I see you did a lot of work in coding a lot of necessary things. :-)

Today, I will begin to make a parser for ppw.rc to mysql.

Greetings Jan Marco

P.S. I upgraded my harddisks in ppc to (2 Tb +4 Tb =) 6 Tb and memory to 32 Gb.

jmalkema commented 5 years ago

Hello Sobolev,

I parse ppw.rc in two files: ppw_rc_mysql_screen_dump

Next try is to scan ppw.rc for a "dialogex" structure. If i see it, i put it in a "dialogex" memory structure and put it from memory structure to output file (ppw_out.rc). I will look for difference of the input file ppw.rc and the output file ppw_out.rc with WinMerge.

I looked for the Microsoft translator: azure_azure_portal

I have to give my credit card information: identity_verification_by_card Maybe it is a good thing to do, maybe there are better solutions.

Greetings Jan Marco

P.S. Sobolev, Do you have email or other methode to send my (experimental/test) code?

papyrussolution commented 5 years ago

Hello, Jan. Glad to read your messages again. My email: sobolev@petroglif.ru or soobolev@yandex.ru. Skype: soobolev. Microsoft Asure requires a card's info but doesn't write off money for limited translations (about 2 mln words per month). You've made a greate amount of the work!