Вверх ↑
Этот топик читают: Гость
Гость
Ответов: 17029
Рейтинг: 0
#1276: 2014-09-01 21:01:10 правка | ЛС | профиль | цитата


Редактировалось 4 раз(а), последний 2021-05-21 07:58:55
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#1277: 2014-09-01 21:10:26 правка | ЛС | профиль | цитата


Редактировалось 4 раз(а), последний 2021-05-21 07:58:55
карма: 0

0
Ответов: 413
Рейтинг: 57
#1278: 2014-10-28 21:34:50 ЛС | профиль | цитата
Добрый вечер!
[flood]
Подскажите как правильно вызвать число строк в таблице?
Создаю базу так:
CREATE TABLE if not exists reshenia(id integer primary key AUTOINCREMENT, nom_res char, dat_utv char,. . .);
Затем пытаюсь узнать id последней строки. Так вызвал значения всей колонки:
SELECT id FROM 'reshenia'
Ранее в этой теме была такая запись:
Tad писал(а):
SELECT seq FROM sqlite_sequence WHERE name="имя таблицы";

пытался так:
SELECT seq FROM sqlite_sequence WHERE name='reshenia'
но результата нет. Однако так вроде выдает:
SELECT seq FROM sqlite_sequence
правильно ли это и будет ли работать если в базе будет более одной таблицы?

После создания второй таблицы в базе заработало так:
SELECT seq FROM sqlite_sequence WHERE name="reshenia";
По видимому из-за наличия лиш одной таблицы в базе и не хотела работать ранее с указанием имени таблицы.[/flood]
Прошу прощения за флуд.

карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1279: 2014-10-29 08:53:03 ЛС | профиль | цитата
Poputchik писал(а):
Затем пытаюсь узнать id последней строки. Так вызвал значения всей колонки:
SELECT id FROM 'reshenia'

SELECT id FROM 'reshenia' - это не число строк в таблице.
Даже SELECT max(id) FROM 'reshenia' - тоже не число строк в таблице.
poputchik_1.png
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1poputchik_1.png [11KB] [872]
Ответов: 413
Рейтинг: 57
#1280: 2014-10-29 19:56:53 ЛС | профиль | цитата
Tad писал(а):
SELECT id FROM 'reshenia' - это не число строк в таблице.

если отсчет первой строки начался с единицы и приращение будет автоматически на единицу, то должно совпадать с числом строк в таблице.
Можно ли прописать в запросе проверку на несовпадение значений по нескольким колонкам при добавлении строки в таблицу и при выполнении условия добавлять, а иначе выдавать сообщение. Или лучше проверять запросом на поиск подобной сохраняемой строке и уже в зависимости от нахождения или нет средствами HiAsm выводить сообщение (как правильнее?)
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1281: 2014-10-29 23:04:22 ЛС | профиль | цитата
Poputchik писал(а):
если отсчет первой строки начался с единицы и приращение будет автоматически на единицу, то должно совпадать с числом строк в таблице.
В таблицу занесли 100 строк.
Потом удалили первых 50 строк.
Наибольшее id = 100,
а строк всего 50.
Самый надежный способ - это SELECT count() FROM 'reshenia'

Насчет проверки на повтор.
Если значение в колонке ни в коем случае не должно повторяться, то при CREATE TABLE указать для колонки, например : <имя колонки> TEXT UNIQUE
Плох не тот, кто не знает, а тот, кто не хочет знать.

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 413
Рейтинг: 57
#1282: 2014-10-29 23:22:49 ЛС | профиль | цитата
Tad писал(а):
Самый надежный способ - это SELECT count() FROM 'reshenia'

Спасибо! завтра попробую так и сделать.
Tad писал(а):
Если значение в колонке ни в коем случае не должно повторяться, то при CREATE TABLE указать для колонки, например : <имя колонки> TEXT UNIQUE

это тоже пригодится, но у меня чуточку иная задача: мне нужно чтоб одновременно по нескольким колонкам не было совпадений, а по одной могут повторятся. Т.е., к примеру у меня 10 колонок из них: название, номер, дефект могут повторятся, а вот название, номер, дефект и дата не должны и такая строка не должна быть добавлена в базу (это что бы одну и ту же запись не внесли многократно, но возможно пользователь внес в другие поля изменения и хочет заменить существующую запись. Соответственно мне нужно уведамить его о совпадении и предложить перезаписать, добавить или отменить добавление).
Сейчас я пытаюсь это сделать так:
Add(MainForm,2953706,21,105)
{
}
Add(LineBreak,7645958,259,224)
{
Caption="add"
link(Out,9396722:doEvent1,[])
Primary=[5281194,-84,7]
}
Add(LineBreakEx,4506383,364,98)
{
Type=3
link(_Data,7371429:Text,[])
}
Add(VisualStrings,7371429,364,63)
{
@Hint=#11:Имя таблицы|
Lines=#8:Reshenia|
Width=67
}
Add(DSC_Query,4255650,434,231)
{
DSManager="db1"
link(onQuery,5058227:doValue,[(473,237)(473,188)])
link(onError,4628038:doWork,[])
}
Add(LineBreakEx,12970717,343,203)
{
Type=2
}
Add(LineBreakEx,4628038,483,245)
{
Caption="Error"
}
Add(Charset,5853246,392,231)
{
Type=6
link(onCharset,4255650:doQuery,[])
}
Add(FormatStr,13568856,343,231)
{
DataCount=5
Mask="SELECT nom_izd, nd_akt FROM %1 WHERE %2 LIKE '%%%3%' END WHERE %4 LIKE '%%%5%'"
link(onFString,5853246:doCharset,[])
link(Str1,12970717:getVar,[])
}
Add(Memory,5058227,511,182)
{
}
Add(Hub,9396722,308,224)
{
OutCount=3
link(onEvent1,5058227:doClear,[(333,230)(333,195)])
link(onEvent2,13568856:doString,[])
link(onEvent3,12721262:doCompare,[(340,244)(340,286)])
}
Add(If_else,12721262,532,280)
{
link(onTrue,4804948:doString,[])
link(onFalse,2522072:doMessage,[(578,293)(578,335)])
link(Op1,5058227:Value,[(538,236)(517,236)])
link(Op2,7435311:Value,[(545,237)(566,237)])
}
Add(Memory,7435311,560,182)
{
}
Add(FormatStr,4804948,588,280)
{
DataCount=14
Mask="INSERT INTO '%1' (nom_res, dat_utv, tip_izd, nom_izd, nar_izd, nom_ra, pri_ra, nom_vch, baz_vch, nd_akt, pri_akt, xor_akt, tabl) VALUES ('%2', '%3', '%4', '%5', '%6', '%7', '%8', '%9', '%10', '%11', '%12', '%13', '%14')"
Point(FString)
link(onFString,364092:doCharset,[])
link(Str1,15428188:getVar,[])
}
Add(LineBreakEx,15428188,588,252)
{
Type=2
}
Add(DSC_Exec,798444,756,280)
{
DSManager="db1"
link(onError,7273134:doWork,[])
}
Add(LineBreakEx,7273134,798,287)
{
Caption="Error"
}
Add(Charset,364092,707,280)
{
Type=6
link(onCharset,798444:doExec,[])
}
Add(Message,2522072,595,329)
{
}
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1283: 2014-10-30 09:45:40 ЛС | профиль | цитата
SELECT count() FROM tabl WHERE название||номер||дефект||дата="Втулка+123+Трещина+20-05-2014";
Потом проверяешь результат : если =0 то разрешаешь сделать INSERT иначе предлагаешь "Отменить" или UPDATE
------------ Дoбавленo в 10.45:
Посмотрел твой код.
На форме ввода данных nom_izd и nd_akt должны вводиться первыми.
Сразу после ввода по onChange выполняешь
SELECT * FROM Reshenia WHERE nom_izd||nd_akt="%1%2"; (строка в первом FormatStr)
и результат (если есть такой) разбрасываешь по окнам ввола и запрещаешь кнопки "Добавить" и "Сохранить".
Т.е. пользователь сразу видит, есть такое или нет.
Контролируешь точки onChange у всех окон ввода. Если были изменения, то разрешаешь кнопку "Сохранить".
Кнопка "Отказаться" всегда активна и просто очищает окна ввода.

Для более точной подсказки не помешало бы увидеть твоё
CREATE TABLE Reshenia с комментариями к кождой колонке.
примерно так
CREATE TABLE elements(
id INTEGER PRIMARY KEY AUTOINCREMENT, -- идентификатор элемента
name varchar(64), -- название элемента
info varchar(64), -- краткое описание элемента
tab int, -- идентификатор группы
pos int, -- позиция иконки в окне выбора
hash varchar(32) -- hash-сумма pas-файла элемента
)
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:Poputchik
Гость
Ответов: 17029
Рейтинг: 0
#1284: 2014-10-30 14:12:35 правка | ЛС | профиль | цитата


Редактировалось 4 раз(а), последний 2021-05-21 07:58:55
карма: 0

0
Ответов: 704
Рейтинг: 44
#1285: 2014-10-30 17:13:52 ЛС | профиль | цитата
г. Григорий писал(а):
на запрос SELECT * FROM ZCH WHERE nameid > 23456 ответа нету

А вы что хотели увидеть в результате? Естественно что результат будет нулевой. Потому что больше 23456 нет значения в бд. И соответственно возвращает Null.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1286: 2014-10-30 17:25:25 ЛС | профиль | цитата
Kazbek17 писал(а):
И соответственно возвращает Null.
Если Null, то события нет.
А ему зачем-то понадобилось событие.
Решается только схемно или предварительным запросом:

SELECT count() FROM ZCH WHERE nameid > 23456; 
Если вернуло 0 значит таких записей нет.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 413
Рейтинг: 57
#1287: 2014-10-30 21:31:50 ЛС | профиль | цитата
Добрый вечер!
Tad писал(а):
Сразу после ввода по onChange выполняешь SELECT * FROM Reshenia WHERE nom_izd||nd_akt="%1%2"; (строка в первом FormatStr)
и результат (если есть такой) разбрасываешь по окнам ввола и запрещаешь кнопки "Добавить" и "Сохранить".
Т.е. пользователь сразу видит, есть такое или нет.

есть загвоздочки, например если человек вводит номер который в себе содержит ранее введенный номер (например 1234 содержит в себе 123) то считывание из базы и заполнение полей произойдет в момент ввода 123, что соответствует другой строке в базе. Но идея мне понравилась. Спасибо! Думаю немного видоизменю под себя и будет самое то.

Tad писал(а):
Для более точной подсказки не помешало бы увидеть твоё
CREATE TABLE Reshenia


Создаю ее такой командой:
CREATE TABLE if not exists reshenia(id integer primary key AUTOINCREMENT, nom_res char, . . . ) где:
id - нумерация строк, с возможностью изменения пользователем, т.к. может быть необходимо пропустить какой то номер.
nom_res и остальные колонки char. В основном в них будет текст за исключением двух с которыми я еще не знаю как мне быть.
А именно это колонка в которой будет содержаться многострочный текст преобразованный в строку с разделителем.
Как его (многострочный тест) лучше хранить в базе не знаю. Но мне нужна возможность поиск по нем дат. Может как-то иначе это нужно делать, например сохранять в отдельную колонку даты, но тогда его (многострочный текст) нужно еще перед сохранением на даты проверять и при нахождении в отдельный столбец базы записывать.
Мне нужно сравнивать дату в этой колонке с текущей и выводить сообщение если остался один день до ее наступления. Хотелось бы средствами базы это реализовать (имею ввиду поиск и сравнение дат. Отсюда возникает вопрос: в каком формате хранить даты (какой тип данных для колонки) и как их сравнивать чтоб база понимала, что сравниваются даты а не строки?
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1288: 2014-10-31 21:05:33 ЛС | профиль | цитата
Poputchik писал(а):
id - нумерация строк, с возможностью изменения пользователем
Poputchik писал(а):
т.к. может быть необходимо пропустить какой то номер.
это какая же такая необходимость ? Тогда зачем
Poputchik писал(а):
id integer primary key AUTOINCREMENT


карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 413
Рейтинг: 57
#1289: 2014-10-31 21:10:47 ЛС | профиль | цитата
Tad писал(а):
Тогда зачем Poputchik писал(а)
id integer primary key AUTOINCREMENT

что бы приращение было автоматическим к последнему внесенному номеру строки. (По умолчанию нумерация сквозная начиная с 1, но возможны случаи когда документ под номером был, но его не внесли в базу и чтоб следующий документ имел правильную нумерацию ему в ручную можно изменить ее) Возможно я что-то не верно делаю.
сравнить даты в базе Sqlite возможно?

На одном сайте нашел вот такую запись:
[flood]
sqlite> create table t (dt_system text);

sqlite> insert into t values (strftime('%Y.%m.%d %H:%M:%S', 'now', '-3 day'));
sqlite> insert into t values (strftime('%Y.%m.%d %H:%M:%S', 'now', '-2 day'));
sqlite> insert into t values (strftime('%Y.%m.%d %H:%M:%S', 'now', '-1 day'));
sqlite> insert into t values (strftime('%Y.%m.%d %H:%M:%S', 'now', '0 day'));
sqlite> insert into t values (strftime('%Y.%m.%d %H:%M:%S', 'now', '1 day'));
sqlite> insert into t values (strftime('%Y.%m.%d %H:%M:%S', 'now', '2 day'));
sqlite> insert into t values (strftime('%Y.%m.%d %H:%M:%S', 'now', '3 day'));

sqlite> select * from t;
2011.01.27 01:12:10
2011.01.28 01:12:15
2011.01.29 01:12:18
2011.01.30 01:12:22
2011.01.31 01:12:26
2011.02.01 01:12:29
2011.02.02 01:12:32

sqlite> select * from t where strftime('%Y.%m.%d %H:%M:%S', 'now') >= dt_system;
2011.01.27 01:12:10
2011.01.28 01:12:15
2011.01.29 01:12:18
2011.01.30 01:12:22

sqlite> select * from t where strftime('%Y.%m.%d %H:%M:%S', 'now') <= dt_system;
2011.01.31 01:12:26
2011.02.01 01:12:29
2011.02.02 01:12:32[/flood]
не знаю рабочая или нет и как будет грамотнее если возможно. Мне нужно уведомлять пользователя о том, что до окончания срока остался день.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1290: 2014-10-31 21:40:18 ЛС | профиль | цитата
select * from tabl where strftime('%Y.%m.%d', 'now','+1 day', 'localtime') -- это текущая дата + 1 день (т.е. завтра)
= <имя колонки с твоей датой в формате '%Y.%m.%d'>;
Если у тебя дата в другом формате, то измени строку формата в функции strftime().
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)