Fix generate Insert SQL instruction. Copying result lines based on a template.

1. При некоторых настройках при генерации Insert инструкций, пустые строки заменялись на null.
   Этот коммит исправлет проблему.
2. Результаты запросов можно оформить произвольным образом используя шаблоны указанные в однострочных
   коментариях.
   Формат шаблона: --@gen:Имя шаблона в контестном меню результата:Тут текст шаблона - cols = @colname@,@colname2,a@\n
   Для добавлнения перевода строк в вывод можно использовать \n.
   Коментарии указывается в теле запроса (можно указать перед запросом).
   Можно указать строку из которой нужно сделать выбрать содержимое:
       @colname[-1]@ - содержимое колонки colname предыдущей строки(относительная адресация).
       @colname[0]@  - содержимое колонки colname 1 строки (или выделенного диапазона строк).
                       Адресация с начинается с 0. Это абсолютная адресация строк.
       @colname2,a@  - Указание что результат нужно будет выровнять.
                       Флаг "а" глобальный его можно указать у любой колонки.
       Флаги указываются в самом конце определения колонки после запятой. Пример: @col1[-1],a@

   Если перечень имен колонок запроса не совпадает со списком полей шаблона то шаблон не будет добавлен
   в контекстное меню Generate.
   Полученный текст копируется в буфер обмена.
   При генерации текста используются настройки "Вид кавычек" и "Что брать в кавычки".
   Шаблоны сохраняются перед выполнением SQL команды и после редактирования шаблона
   запрос нужно выполнить повторно.
This commit is contained in:
lsv 2026-01-14 17:17:08 +05:00
parent 087ad55c34
commit a8ddbc4999
8 changed files with 235 additions and 10 deletions

View file

@ -284,6 +284,7 @@ wxString ctlSQLGrid::GetExportLine(int row, wxArrayInt cols)
if (GetNumberCols() == 0 || GetRowSize(row) == 0)
return str;
sqlResultTable *t=(sqlResultTable *)GetTable();
wxString colsep = settings->GetCopyColSeparator();
if (generatesql == 2 || generatesql == 1) colsep = wxT(",");
if (generatesql == 3) colsep = wxT(" and ");
@ -297,7 +298,14 @@ wxString ctlSQLGrid::GetExportLine(int row, wxArrayInt cols)
str.Append(colsep);
if (col > 0) head.Append(colsep);
head = head + GetColumnName(cols[col]);
wxString text = GetCellValue(row, cols[col]);
wxString text;
bool isnull=false;
if ( t && generatesql > 0)
{
// only insert , in_list and where list
text = t->GetValueWithNull( row, cols[col] , &isnull );
} else text = GetCellValue(row, cols[col]);
wxString cname = GetColumnName(cols[col]);
bool needQuote = false;
if (settings->GetCopyQuoting() == 1)
@ -307,12 +315,12 @@ wxString ctlSQLGrid::GetExportLine(int row, wxArrayInt cols)
else if (settings->GetCopyQuoting() == 2)
/* Quote everything */
needQuote = true;
if (text.Length() == 0 && generatesql > 0) { needQuote = false; }
if (isnull && generatesql > 0) { needQuote = false; }
else
if (generatesql > 0) needQuote = IsColText(cols[col]);
if (generatesql > 0) {
if (text.Length() != 0) {
if (!isnull) {
text.Replace(wxT("'"), wxT("''"));
}
else
@ -320,7 +328,7 @@ wxString ctlSQLGrid::GetExportLine(int row, wxArrayInt cols)
}
if (generatesql == 3) {
if (text == "null")
if (isnull)
str.Append(cname).Append(" is ");
else
str.Append(cname).Append("=");