All streams
Search
Write a publication
Pull to refresh
14
0.1
Александр Кудрявцев @ALexKud

Инженер-электроник, программист (SQL)

Send message

Проблема возможно в том что вы создаете план этой важной работы в голове и он не совсем вам понятен. Отсюда страх и т п. Надо перенести его на бумагу, визуализировать. Процесс переноса очень важен, так как помогает открыть некоторые аспекты, которые даже в голову не приходят. Ну после того как составили план, далее все просто. Возникает желание его реализовать, пусть даже если некоторые детали вам не ясны. Их можно у LLM спросить и возможно это натолкнет на правильный путь. Со мной это работает.

Тут надо технически. Sqlite блокирует весь файл БД при записи в таблицы. У меня 2 клиента пишут в БД . один в виде программы с интервалом 1 сек. А второй по таймеру из другой программы. Мне пришлось то что пишет первый через триггер в бд переписывать в другую таблицу, в которую пишет второй с предварительной ее чисткой по таймеру . на втором клиенте пришлось еще добавить настройку драйвера firedac на ожидание разблокировки БД. Иначе периодически выскакивали сообщения о том что бд заблокирована. Режим wal включен кстати.

Логику в хранимых процедурах применяю потому что проще разрабатывать приложения баз данных, чем использовать одни запросы, особенно если нужна сложная обработка данных и даже не только это, а то что код запросов не хранится на клиенте и я использую триггеры БД для хранения всех корректировок схемы и таблиц БД, пользователей, хранимок, короче всего DML. Приложения у меня сложные и я применяю не только хранимки, но и функции, синонимы и системные иногда объекты SQL Server. Насчет что писать сложнее на SQL чем на обычном языке - это не так. Просто SQL это немного другой подход в программировании, тут требуется хорошее знание SQL и умение оптимизировать SQL код и еще много чего архитектурного в создании приложений БД. Сейчас я заканчиваю портирование одного своего приложения на SQLite. Там нет хранимок и я ощутил насколько неудобно и сложно разрабатывать в локальной БД приложение со сложной логикой без хранимок. Где все делает одна хранимая процедура, с запросами иногда приходится городить огород из последовательных наборов запросов и усложнять код на клиенте. Использование CTE не всегда выручает, но помогает. В общем объединение двух БД, серверной и локальной получилось, но проблем с локальной БД SQLite и ее запросами было много. Там где работает простой код запроса хранимки SQLserver, перенос запроса в SQLite иногда не работает и приходится его оптимизировать, меняя много чего в коде. Думал что это будет быстро сделано, так как рельсы уже были, но паровоз пришлость строить заново.

А я вернулся к старой двухзвенке и она на новой delphi очень даже неплоха в корпоративной сети с SQL Server и даже с SQLite через FireDac драйвер.

Практически мгновенная компиляция, остутствие тормозов даже при работе через VPN выгодно отличает связку DElphi+SQLserver+хранимые процедуры от PHP, программы которой даже не запускаются на старых компах под Win10.

Для меня создание DSL было очень увлекательно и все получилось. Статья в моем профиле хабра.

Для игр компьютеров не было особо в конце 80-х, но компьютеры для предприятий были, даже делали клоны IBM PC. Многие конторы разрабатывали ПО для предприятий( базы данных). Я работал в такой, и даже прошел обучение по Искра 1030 ( хотя оно мне было и не особо нужно, так как я давно уже занимался компьютерами, конторе нужен был сертификат ) и ремонтировал их вполне успешно. ZX спектрум собрал сам, в то время платы и комплектация продавалась на радиорынках. Но быстро стало неинтересно заниматься играми. Хотелось программировать. И когда у нас в конторе появились IBM PC\АT я сваял плату для программирования ПЗУ с УФ стиранием и написал программу на турбо-паскале с редактором для прошивки.Плата вставлялась в ISA слот и все работало.

Пишу примерно так код. В основном для себя, чтобы потом через месяц другой не смотреть на него как на нечто непонятное. Некоторые очевидные идентификаторы по имени говорят сами за себя. Не идеально, наверное, но стараюсь как могу называть правильными именами таблицы БД, встроенные процедуры и запросы.

// -------------поддержка коннектов -----------------------------------------

PROCEDURE CONNECT(SERVER :integer) ; // на входе S = номер сервера (0-тестовый 1 - рабочий, 2 - локальный)
PROCEDURE CLOSE_ALL_DATASET();
PROCEDURE CLOSE_ALL_TIMER() ;
PROCEDURE SetDataSets(ID_DATABASE: integer) ; // настройка датасетов на процедуры или запросы в зависмости от выбранной БД
PROCEDURE SaveDataSetToCSV(DataSet: TDataSet; dbgrid: TDBgrid; const FileName: string);

//-----статистика теста прибора, обнаружение Интегратора, -------------------

FUNCTION OPEN_TEST_STATISTIC(ID_DATABASE : integer ) : string ;
FUNCTION NAME_INTEGRATOR() : string;
FUNCTION GetColumnTitleByIndex(DBGrid: TDBGrid; FieldIndex: Integer): string; // получить имя заголовка колонки по индексу поля таблицы

//-----------открытие таблиц с данными -------------------------------------------------------------

FUNCTION OPEN_OPERATION_LOG( ID_DATABASE : integer ;ID_DEVICE : integer; sort : integer ) :string;
FUNCTION OPEN_DATA_TEST(ID_DATABASE : integer) :string;
FUNCTION OPEN_CURRENT_TEST_POOL(ID_CONNECT : integer) : string;
PROCEDURE OPEN_ALL_BOARD(ID_DATABASE: integer;Caterory_device: integer);

//---------- проверка статуса UPDATE\INSERT и дублирования записи SN-------------------

FUNCTION SQLITE_CHECK_STATUS_INSERT_UPDATE() :string;
FUNCTION CHECK_DUPLICATE_SN(SN : string) : boolean ;
FUNCTION SQLITE_CHECK_STATUS_INSERT_BULK(TEST_POOL: integer ; SN : string ) :string;

//----------загрузка настроек из БД и создание конфигурации теста ----------

FUNCTION CREATE_BOARD_CONFIG_TEMP_USER( ID_CONNECT: integer ) :string; // вход - номер подключения - выход статус операций = 'PASS'
FUNCTION LOAD_SYSTEM_SETTING_TABLE(ID_DATABASE: integer) :string; // ID_DATABASE - номер базы данных из CBConnection

//----------запись данных тестирования и выгрузка --------------------------------------------------------------------------------------------------------

FUNCTION WRITE_RAW_DATA_TEST_COMMON( ID_DATABASE : integer ; SN : string; VALID : string; TEST_POOL : integer ) : STRING ;
FUNCTION WRITE_INPUT_DATA_DOUBLE_CLICK_SQLITE(IDENT: integer; NAME_REGISTER :string ; CONFIRM_WO_INPUT_DATA : integer) : string;
FUNCTION WRITE_INPUT_DATA_REF_SQLite(MODE: integer ; IDENT :integer ) :string ;
FUNCTION WRITE_INPUT_DATA_DOUBLE_CLICK(IDENT: integer ; ID_DATABASE : INTEGER ) : string;
FUNCTION WRITE_DATA_TAG_CONFIG_TEMP_SQLite(IDENT : integer ; COLUMN : integer ;MODE : integer) : string;
FUNCTION WRITE_TAG_CODE_SQLite(tag_input : shortstring ) : string ;
FUNCTION WRITE_DATA_BOARD_CONFIG_TEMP_SQLite(IDENT :integer; COLUMN_INDEX : integer; ident_str :STRING) : string;
FUNCTION WRITE_DATA_BOARD_CONFIG_TEMP_MSSQL(IDENT :integer; COLUMN_INDEX : integer; ident_str :STRING) : string;
FUNCTION SaveStatusTest_SQLite() :string;
FUNCTION RESET_VALUE_SQLITE( IDENT : integer; INDEX_ID : integer; ident_str :string) : string;
FUNCTION WriteSettingToDatabase_common (ID_DATABASE: integer ; OPERATION: integer; SETTING: string; ACTION: string; NAME_ACTION: string) : string;
FUNCTION WRITE_OPERATION_LOG_SQLITE(TEST_POOL : integer ; NUMBER_OPERATION : integer ; PARAMETR : string) : string;
FUNCTION CLOSURE_TEST_POOL_COMMON( ID_DATABASE : integer ; TEST_POOL : Integer ; OPERATION : string ; ID_DEVICE :Integer ; ID_CONFIG : integer ) : string ;

// ---------------- функция фильтрации выполненных тестов --------------------
FUNCTION SHOW_ALL_TESTS_COMMON ( ID_DATABASE : integer ; PERIOD : integer ;
USER_STATE : boolean ;
USER_NAME_INDX : integer ;
USER_NAME_TEXT : string ;
Device :boolean ;
Defect :boolean ;
Arhive : boolean ;
ADD_COLMN :boolean ) : string;

// ------------------ Открытие списка протестированных изделий ----------
FUNCTION GETFILTER_ID1( DATE_START : tdatetime ; //начало периода
DATE_END : tdatetime; //конец периода
USER : string ; // пользователь
ID_DEVICE : integer ; // идентификатор изделия
id_config :integer ; // идентификатор конфигурации теста изделия
TEST_FAIL : integer ; // Брак
ARHIVE : boolean ; // признак архивной записи
ID1 : integer; // идентификатор первого вставленного в таблицу транспонированного стробца
ID2 : integer // идентификатор второго вставленного в таблицу транспонированного стробца

                       )  : string   ;

FUNCTION GET_BOARD_TEST_COMMON(ID_DATABASE : integer ;TEST_POOL: integer ; SN : string ) : string ;
FUNCTION GET_IMAGE_BOARD (ID_DATABASE : integer; ID_DEVICE :integer ; ID_CONFIG : Integer) : string ;

//---------системные функции для выгрузки и записи данных ------------------

FUNCTION GetSpecialPath(CSIDL: word): string; // переменные окружения по CSIDL
FUNCTION GetCurrentUserName() : string;
FUNCTION GetProcessByEXE(exename: string): THandle; // получить признак запуска программы по имени *.exe
FUNCTION HOST_NAME() : String;
PROCEDURE Delay(Value: Cardinal);
FUNCTION GET_FULL_PATH(RELATIVE_PATH : string) : string ; // возврат полного пути относительно текущей директории

// ---- Отметка строки как заголовка группы ---------------------------------

procedure Install_type_control( ident : integer);

//----------- добавление контрак-поставщиков ---------------------------------------
PROCEDURE GET_CONTRACT(); // получить список
PROCEDURE IMPORT_CONTRACT() ; // импортировать данныу поставщиков
PROCEDURE EXPORT_CONTRACT(); // экспорт данных в локальную БД
FUNCTION ADD_CONTRACT() : STRING;
FUNCTION ADD_DEVICE_CONTRACT(ID_CONTRACT: string ; ID_DEVICE : integer ;ID_CONFIG: Integer ; MESS : string ) : string ;

Любой объект вселенной состоит из атомов. Но атом по факту почти пустой. Вселенная тоже почти пустая, не считая звезд на огромном расстоянии друг от друга. Время это не материальная субстанция и сжиматься не может никак. Математические модели могут любые абстракции связывать в любых отношениях но важны физические основы. Если их нет, то все эти теории отражают модель мира с относительным приближением и не более.

В моем профиле есть статья с описанием системы и кратко как она развивалась.

Ну во первых не во всех областях разработки это имеет смысл и конкретно я думаю что в WEB это нереально. Мой опыт в разработке такой системы относится к специфической нишевой области создания MES систем в двухзвенной схеме. Я описал это в своей статье здесь на хабре, она доступна в моем профиле. Возможно такое можно и в других областях использовать. В моем случае это просто попадание в точку, так как одна система должна поддерживать свою область и быть легко расширяема в области программирования и операторов DSL. Отладка без проблем, когда поддерживается пошаговый режим работы + переход на произвольную строку. Но клиент в этом случае только интерпретатор с загрузкой программы DSL построчно и вся бизнес логика в хранимых процедурах на сервере.

Если позволяет приложение, то создание собственного DSL для него решает множество проблем, обозначенных в статье. В моем случае это стало палочкой выручалочкой уже на лет 6, когда введение новых фич означало только доработку или создание новых примитивов на придуманном для этого DSL, что в общем не было слишком сложно и затратно. Ну и архитектура, которая позволяет протестить быстро, незатратно и независимо новые фичи.

Я использую deepseek иногда для целей своих проектов как программист. Порой он ошибается и зацикливается на своих ошибках. Но у меня сложные задачи и не web. Вам успехов на вашем поприще. Хорошо что у вас не возникло проблем, требующих глубокого знания и опыта программирования.

Все это для энтузиастов, умеющих работать с большими данными в Excel.

Да, передача данных на ваш сервер делается средствами 1C

Запись нескольких миллионов строк в тхт не будет быстрой. В моем варианте можно настроить в 1С запись только новый появившихся данных и не каждый раз весь требуемый набор.

Я написал что в самой 1С есть возможность ее средствами настроить запись данных в таблицы другого MS SQL SERVER напрямую. Никто не будет напрямую читать данные 1С из ее таблиц.

Если задача решается слишком сложно, как вы описали, значит ее можно упростить и довольно значительно. Можно применить такой вариант- создать нужную инфраструктуру в sql server и настроить передачу данных напрямую из 1C в таблицы sql server и там же в sql server сделать нужные процедуры и функции обработки данных для отображения в exel файлах в качестве дашбордов через sql запросы в самих exel файлах. Но тут надо хорошо знать. SQL и уметь работать с 1С по связи с sql server напрямую(в документации 1с все описано). Зато никаких питонов и прочей обвязки и можно оптимизировать sql запросы по скорости работы. Если база данных будет расти то оптимизация ее настоятельно рекомендуется.

В одном, из приложений я решил хранить sql код в самой БД в отдельной таблице. Для сетевой и локальной версий и это работает. Храню как запросы так и хранимые процедуры для двух баз sqlite и sql server.

Работал с. Deepseek по sqlite. Была проблема неработающим запросом записи данных insert c ON Conflict. Был создан уникальный индекс, но не работало. ИИ зациклился, выдавая одно и тоже и мантру должно работать. Помог старый добрый stack overflow. Оказывается если нет условия WHERE то его надо добавить типа where true. Ошибка парсинга запроса в sqlite при отсутствии where. Так что бесполезен в этом случае оказался этот ИИ. Простая задача такой облом. Даже как справочник не справился. Вот вам и лошадиная фамилия - Овсов.

Да, вы правы. Я стараюсь избегать использования ИИ. Но иногда он помогает, допустим написать функцию какую нибудь, типа сконвертировать данные в csv или. Json.

1
23 ...

Information

Rating
4,135-th
Location
Россия
Registered
Activity

Specialization

Application Developer, Database Architect
Lead
From 200,000 ₽
SQL
Database
Software development
Algorithms and data structures
Database design
Delphi
MSSQL
Microsoft SQL Server
Visual Studio
Code Optimization