powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выравнивание значений
36 сообщений из 36, показаны все 2 страниц
Выравнивание значений
    #40070696
Caxa_ASS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Как выровнять все значения столбца в таблице или по левому краю или по правому? Тип данных в столбце - bigint.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070700
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столбцы -- в экселе. В MSSQL -- поля, и у них нет краев, ни левых, ни правых.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070708
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
Столбцы -- в экселе. В MSSQL -- поля, и у них нет краев, ни левых, ни правых.

Не, ну неправда ваша.
Края там, конечно, есть. LTRIM и RTRIM тому свидетели.
Только вот выравнивать сервер не умеет.
Клинтское это дело...
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070720
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Края там, конечно, есть. LTRIM и RTRIM тому свидетели.
Края есть, когда дело доходит до отображения данных, на экране или там при печати. Но этим занимается вовсе не сервер, а используемый клиент. Так что края, конечно, есть - но не "там".
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070726
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
aleks222
Края там, конечно, есть. LTRIM и RTRIM тому свидетели.
Края есть, когда дело доходит до отображения данных, на экране или там при печати. Но этим занимается вовсе не сервер, а используемый клиент. Так что края, конечно, есть - но не "там".

Ну, можно отрицать даже то, что земля круглаяесть LTRIM и RTRIM.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070739
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
можно отрицать даже то, что есть LTRIM и RTRIM.
Есть, есть... только они никакого отношения к выравниванию не имеют. Вот были бы LPAD/RPAD или соответствующие атрибуты у полей - они б ещё худо-бедно подошли.

Кстати, использование LTRIM/RTRIM ну никаким образом не заставит клиента прижать значение к левому или правому краю, хоть застрелись - у него для поля есть свойство xxx_justify, и чхать он хотел на всё. А грид или куда там оно выводится - так и вовсе не в курсе, какие в запросе были использованы функции.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070742
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Akina
пропущено...
Края есть, когда дело доходит до отображения данных, на экране или там при печати. Но этим занимается вовсе не сервер, а используемый клиент. Так что края, конечно, есть - но не "там".

Ну, можно отрицать даже то, что земля круглаяесть LTRIM и RTRIM.
Для типа BIGINT?
Всё равно же придётся преобразовывать в строку. Только для отображения.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070744
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тс явно промахнулся форумом, ему надо изучать язык средства написания клиентского приложения.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070801
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
aleks222
можно отрицать даже то, что есть LTRIM и RTRIM.
Есть, есть... только они никакого отношения к выравниванию не имеют. Вот были бы LPAD/RPAD или соответствующие атрибуты у полей - они б ещё худо-бедно подошли.

Кстати, использование LTRIM/RTRIM ну никаким образом не заставит клиента прижать значение к левому или правому краю, хоть застрелись - у него для поля есть свойство xxx_justify, и чхать он хотел на всё. А грид или куда там оно выводится - так и вовсе не в курсе, какие в запросе были использованы функции.


Опять передергиваете.
Базар был за "края".
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070804
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap
aleks222
пропущено...

Ну, можно отрицать даже то, что земля круглаяесть LTRIM и RTRIM.
Для типа BIGINT?
Всё равно же придётся преобразовывать в строку. Только для отображения.

Первый бит - последний бит.
Ну, может и не края.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070874
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
Столбцы -- в экселе. В MSSQL -- поля, и у них нет краев, ни левых, ни правых.


Если время военное, то можно и значение синуса довести до 4 и столбцы выравнять по левому краю.

Код: sql
1.
2.
3.
4.
SELECT SUBSTRING(CONCAT(N, REPLICATE(' ', 20)), 1, 20) FROM 
(
	SELECT 1 AS N UNION ALL SELECT 22423423 UNION ALL SELECT -3333
) B
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070921
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Осталось синус довести до 6:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @L int = 10;

SELECT SUBSTRING(CONCAT(N, REPLICATE(' ', 20)), 1, 20) -- по левому краю
      ,right(concat(replicate(' ', @L), N), @L)        -- по правому краю
      ,concat(replicate('.', (@L-len(N)) / 2), N, replicate('.', @L-len(N)-((@L-len(N)) / 2))) -- по центру

FROM 
(
	SELECT 1 AS N UNION ALL SELECT 22423423 UNION ALL SELECT -3333
) B


Результат по центру:

Код: plaintext
1.
2.
3.
....1.....
.22423423.
..-3333...
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070922
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l
Осталось синус довести до 6:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @L int = 10;

SELECT SUBSTRING(CONCAT(N, REPLICATE(' ', 20)), 1, 20) -- по левому краю
      ,right(concat(replicate(' ', @L), N), @L)        -- по правому краю
      ,concat(replicate('.', (@L-len(N)) / 2), N, replicate('.', @L-len(N)-((@L-len(N)) / 2))) -- по центру

FROM 
(
	SELECT 1 AS N UNION ALL SELECT 22423423 UNION ALL SELECT -3333
) B


Результат по центру:

Код: plaintext
1.
2.
3.
....1.....
.22423423.
..-3333...


Это позор.
https://docs.microsoft.com/ru-ru/sql/t-sql/functions/str-transact-sql?view=sql-server-ver15
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070924
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

Раз сказал А, скажи и В. Как str поможет выровнять строковое представление числа по центру?
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070929
DaniilSeryi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги! Не ссорьтесь и вспомните про функцию format:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 use [AdventureWorks2014]
 GO
  SELECT TOP(5)CurrencyRateID, EndOfDayRate
              ,FORMAT(EndOfDayRate, 'N', 'en-us') AS 'EN-US Number Format'
              ,FORMAT(EndOfDayRate, 'G', 'en-us') AS 'EN-US General Format'
              ,FORMAT(EndOfDayRate, 'C', 'en-us') AS 'EN-US Currency Format'
			  ,FORMAT(EndOfDayRate, '000,000,000,000.00', 'en-us') AS 'EN-US Custom Format'
			  ,FORMAT(EndOfDayRate, '000,000,000,000.00', 'en-us') AS 'EN-US INTEGER Custom Format'
			   ,FORMAT(EndOfDayRate, 'N', 'ru-ru') AS 'RU-RU Number Format'
              ,FORMAT(EndOfDayRate, 'G', 'ru-ru') AS 'RU-RU General Format'
              ,FORMAT(EndOfDayRate, 'C', 'ru-ru') AS 'RU-RU Currency Format'
			  ,FORMAT(EndOfDayRate, '000,000,000,000.00', 'ru-ru') AS 'RU-RU Custom Format'
			  ,FORMAT(EndOfDayRate, '000,000,000,000.00', 'ru-ru') AS 'RU-RU INTEGER Custom Format'
			  ,FORMAT(EndOfDayRate*1000000, '####.00', 'ru-ru') AS 'RU-RU # Custom Format'
			  ,FORMAT(EndOfDayRate, '0.00%', 'ru-ru') AS 'RU-RU % Custom Format'
  FROM Sales.CurrencyRate
  ORDER BY CurrencyRateID;



Сервер 2014.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40070997
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DaniilSeryi,

1.Здесь никто и не ссорится, решаем программистский этюд.

2.Вы не прочли условия задачи, поэтому привели способы форматирования чисел с помощью функции format, но задача-то стоит в эмуляции функций LPAD/RPAD (см. 22322992 ).

3.Вы не увеличили значение синуса, а уменьшили его.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40071002
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всю ночь не спал, всё думал, "как мне позор свой искупить"?

1.Выросло поколение программистов, которые не знают, и есть программисты, которые уже забыли, что такое текстовый режим отображения информации.

2.Задача выравнивания данных в запросе может быть вполне реальной, если нужно, например, подготовить файл для его печати на устройстве, которое а) поддерживает текстовый режим и б) в нем можно установить моноширинный шрифт.

3.Главное получить правильный результат, потом его можно улучшать до бесконечности.

4.Выравнивание по левому краю можно выполнить просто:
cast(N as char(10)),
но есть два но а) длину можно задать только константой; б) если нужно проверить результат, то после cast нужно еще заменить пробелы на точки: replace(cast(N as char(10)), ' ', '.'). Попробуйте сосчитать пробелы на экране или на белом листе бумаге, особенно при пропорциональном шрифте.

5.Выравнивание по правому краю целого числа можно выполнить функцией
str(N, @L [, 0]).
Здесь длину можно задать переменной, но а) для того, чтобы пробелы заменить на точки, нужна будет функция replace; б) нельзя выровнять НЕ целые числа и текст.

6. Осталось привести пример.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare @L int = 10,
        @H char(1) = '.';

SELECT left(concat(N, replicate(@H, @L)), @L)     as L1 -- по левому краю
      ,replace(cast(N as char(10)), ' ', '.')     as L2
      ,right(concat(replicate(@H, @L), N), @L)    as R1 -- по правому краю
      ,replace(str(N, @L), ' ', @H)               as R2
      ,concat(replicate(@H, (@L-len(N)) / 2), N, replicate(@H, @L-len(N)-((@L-len(N)) / 2))) as C1 -- по центру
FROM 
(
	SELECT 1 AS N UNION ALL SELECT 22423423 UNION ALL SELECT -3333
) B



Код: plaintext
1.
2.
3.
L1	        L2      	R1      	R2      	C1
1.........	1.........	.........1	.........1	....1.....
22423423..	22423423..	..22423423	..22423423	.22423423.
-3333.....	-3333.....	.....-3333	.....-3333	..-3333...

В L1 функция substring заменена функцию left для большей наглядности. Выражения L1, R1 C1, на мой взгляд, однотипны, подходят к данным любого типа и легко отлаживаются.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40071055
DaniilSeryi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l,

Ну так числа-то выровнены по длине, и более того - по обоим краям разом! :-)
...
Рейтинг: 0 / 0
Выравнивание значений
    #40071058
Caxa_ASS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l, a_voronin, DaniilSeryi парни, огромное спасибо.

Wlr-l - спасибо за подробное описание и решение!
...
Рейтинг: 0 / 0
Выравнивание значений
    #40071114
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DaniilSeryi
Wlr-l,

Ну так числа-то выровнены по длине, и более того - по обоим краям разом! :-)


1.Вы не прочли условия задачи, поэтому привели способы форматирования чисел с помощью функции format, но задача-то стоит в эмуляции функций LPAD/RPAD (см. 22322992 ).
2.Надо понять, что же все-таки делают функции LPAD и RPAD, которых нет в T-SQL. Если непонятно, то можно взять текстовый редактор и посмотреть, как происходит выравнивание влево, вправо, по центру.
3.Если приводите какие-то примеры из документации, то нужно сначала самому их выполнить и осмыслить результат.
4.Разберем ваш пример, на примере одной культуры с выравниванием влево:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare @L  int      = 10,
        @H  char(1)  = '.';
declare @HH char(20) = replicate(@H, @L);

declare @EndOfDayRate int = 12345;

select replace(FORMAT(@EndOfDayRate, 'N',          'ru-ru'), ' ', '.') AS 'Number'
      ,replace(FORMAT(@EndOfDayRate, 'G',          'ru-ru'), ' ', '.') AS 'General'
      ,replace(FORMAT(@EndOfDayRate, 'C',          'ru-ru'), ' ', '.') AS 'Currency'
      ,replace(FORMAT(@EndOfDayRate, '000,000.00', 'ru-ru'), ' ', '.') AS 'Custom'
      ,replace(FORMAT(@EndOfDayRate, '000,000.00', 'ru-ru'), ' ', '.') AS 'INT Custom'
      ,replace(FORMAT(@EndOfDayRate, '####.00',    'ru-ru'), ' ', '.') AS '# Custom'

      ,left(concat(@EndOfDayRate, @HH), @L)                            as L1



Код: plaintext
1.
2.
Number      General	Currency	Custom		INT Custom	# Custom	L1
12 345,00	12345	12 345,00.₽	012 345,00	012 345,00	12345,00	12345.....

Сравните полученные результаты с эталоном L1. Увидели, что ни один из ваших примеров не решает поставленную задачу?

5.Вы не только уменьшили значение синуса, но и загнали его в отрицательную область.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40071117
DaniilSeryi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l,

блин, уже пошутить нельзя... Будьте немного проще, и разумные к Вам потянутся.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40071148
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DaniilSeryi,

Я искренне рад, что вы поняли разницу между форматированием чисел и выравниванием полей, и что я не зря потратил время на эту задачу. Хоть какая-то польза получилась от меня. А тянуться ко мне не обязательно.


Безусловно функция format - полезная функция. Правда строка формата могла бы быть гибче. Например, можно было бы сделать 'N10.3' – под число отводится 10 позиций, из которых одна отводится под разделитель и три под дробную часть, незанятые позиции заполняются пробелами. Или, например, так 'S-12' – под строку отводится 12 символов, строка как есть прижимается влево (ведущие пробелы не удаляются). Если строка короче 12 символов, то она дополняется пробелами. Если длиннее, то обрезается. 'S12' – то же самое, только строка прижимается вправо. Если уж форматировать, то форматировать.

Конечно, можно свалить это на клиента с гридами и с чем-то там еще. Но часто такого клиента просто нет. Нужен обычный текстовый файл. При этом важно, чтобы механизмы выгрузки результата запроса в файл не вносили своих коррективов в форматирование выгружаемых данных.

Дополнение насчет краев: края хорошо поясняются наличием типов данных CHAR и VARCHAR.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40071186
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Клиент эти пробелы тримнет и весь труд насмарку.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40071438
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
Клиент эти пробелы тримнет и весь труд насмарку.


Посвящается всем тем, кто свято верит в то, что у строк и "полей" в T-SQL нет краев, что строки в T-SQL нельзя прижать к краям "поля", что все клиенты "тримят" пробелы.

1. "Столбцы -- в экселе. В MSSQL – поля".
Правило 1 Кодда: Вся информация в реляционной базе данных на логическом уровне должна быть явно представлена единственным способом: значениями в таблицах. Т.е. в MSSQL данные представлены в таблицах. Эксел тоже оперирует таблицами. Таблица, грубо говоря, – это строки и столбцы. Так в чем разница? В том, что, в одном случае, столбец называют полем, а другом случае, называют столбец столбцом? Действительно ли, что у столбца есть края, а у поля их нет?

2.Проведем эксперимент с краями текстового "поля".
Поскольку SQL Server это вещь в себе, будем общаться с ним на "настоящем" клиенте (я бы сказал самым настоящим из всех настоящих клиентов) SQL Server Management Studio (SSMS). Для эксперимента воспользуется запросом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @c    char(5)      =  '  ab ',
        @v    varchar(5)   =  '  ab ',
        @cn   nchar(5)     = N'  ab ',
        @vn   nvarchar(5)  = N'  ab '

select replace(@c,  ' ', '.') as c,
       replace(@v,  ' ', '.') as v,
       replace(@cn, ' ', '.') as cn,
       replace(@vn, ' ', '.') as vn;


Задавая разные строки в этом запросе получим:

Код: plaintext
1.
2.
3.
4.
5.
№	c	v	cn	vn
1	.....		.....			пустая строка
2	.....	.	.....	.		один пробел
3	ab...	ab.	ab...	ab.		пробел
4	..ab.	..ab.	..ab.	..ab.		пробел пробел a b пробел
5	...ab	...ab	...ab	...ab		пробел пробел пробел a b

Как видим, что CHAR не сохраняет справа пробелы исходной строки, а заполняет ими все отведенное для него пространство ("поле"), а VARCHAR сохраняет справа столько пробелов, сколько их есть в исходной строке.
Ни один из этих типов не удаляет и не добавляет пробелы слева в исходную строку.
Пятый пример демонстрирует прижатие строки 'ab' к правому краю "поля" (выравнивание справа).

Т.е. все происходит ожидаемо.

3.Следующий эксперимент. Данные из примера 4 (в строке есть пробелы слева и справа) выгрузим в файлы txt и csv.
Файл csv, если открыть его, например, Блокнотом, будет таким:
" ab ";" ab ";" ab ";" ab ",
а файл txt будет таким:
ab ab ab ab

Т.е. SQL Server, SSMS, файловая система Windows и Блокнот, взаимодействуя друг с другом, не изменили ни количество пробелов, ни их расположение в исходных данных.
Если SQL Server – это сервер, то SSMS, файловая система Windows и Блокнот – это типичные клиенты. Следовательно, не все клиенты "тримят" пробелы.
Комбинация клавиш Ctrl-C, Ctrl-V в SSMS не изменяет количество пробелов и их расположение. А эта же комбинация клавиш в Блокноте удаляет пробелы справа, т.е. выполняет операцию rtrim, но все остальные пробелы остаются на своих местах.

Можно для полноты счастья заархивировать эти файлы и послать по почте; получить их и разархивировать, потом распечатать, и убедиться, что все пробелы остались на своих местах. А ведь это тоже "клиенты".

Вывод, решая задачу нужно знать и использовать возможности имеющихся инструментальных средств. А можно сделать испуганные глаза и сказать, что все равно клиент (тот еще сферический конь в пальто) съест с таким трудом сформированные пробелы.

Вспомнился разговор на одном из совещаний по изменению документации:
- Так делать нельзя! Это противоречит приказу №ХХХ! – сказал подчиненный.
- А кто готовил этот приказ? – спросил недавно назначенный начальник.
- Мы!
- Так измените этот приказ!
- Мы не можем!
- А что вы можете?
- Отменить этот приказ и издать новый!
- Так сделайте это!


На этом у меня всё по этой теме. Всем удачи!
...
Рейтинг: 0 / 0
Выравнивание значений
    #40071457
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l,

не все клиенты почему, это зависит от настроения программиста. Если он для поля ввода или вывода указал свойство Trim, к примеру, то поступившие данные будут содержать пробелы, но при обновлении контрола или при сохранении пробелы будут усечены. Т.е. если "прокликать", то изображение может поползти. Поэтому надо предусматривать, что элемент управления, который отображает значение, настроен на желаемый вид центровки.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40071494
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Что еще сказать?

Я привел условия применения форматирования данных в запросе, массу клиентов для которых это возможно, реальные ситуации, а вы все о элементах управления. Мир не вращается вокруг элементов управления. И зачем использовать элементы управления, которые нельзя настроить на нужное поведение?

Извините, но я уже потерял интерес к этой теме.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40071537
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l,

Вы не понимаете, что это частные случаи, которые ведут себя как требуется в строго определённых обстоятельствах. При профессиональной разработке так не поступают, данные не форматируют на сервере. Собственно это и есть суть моих сообщений.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40071614
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Wlr-l,

Вы не понимаете, что это частные случаи, которые ведут себя как требуется в строго определённых обстоятельствах. При профессиональной разработке так не поступают, данные не форматируют на сервере. Собственно это и есть суть моих сообщений.

А мужики то в мелкософте не в курсе?
XML c JSON-ом негодуют.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40071769
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"При профессиональной разработке так не поступают". Владислав Колосов.

Я рассказал один эпизод из жизни и закончил его на оптимистичной нотке, не рассказав его настоящий конец. Исправляюсь:

- Так делать нельзя! Это противоречит приказу №ХХХ! – сказал подчиненный.
- А кто готовил этот приказ? – спросил недавно назначенный начальник.
- Мы!
- Так измените этот приказ!
- Мы не можем!
- А что вы можете?
- Отменить этот приказ и издать новый!
- Так сделайте это!
- Так это же… надо внести изменения в текст… распечатать… согласовать… подписать… - начал вслух рассуждать подчиненный.
- Хорошо, пусть всё останется как есть. – упавшим голосом сказал начальник и посмотрел на меня.
Я понял, что должен войти в его положение и утвердительно кивнул головой.

С тех пор прошло более десятка лет, сменилось несколько начальников, продолжает действовать все тот же приказ №ХХХ.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40071979
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отрадно, что есть люди, у которых есть время и энтузиазм, чтобы заниматься такими проблемами... Прям завидно.

А вообще конечно мир человеков не оскудевает всякими извратами. То одни запихивают в клиент не только бизнес-логику, но и даже выбор данных с сиквел-сервера... Мда. То другие заставляют сиквел сервер отображать слева или справа данные при выгрузке.


А нельзя ли использовать всё по назначению?...
...
Рейтинг: 0 / 0
Выравнивание значений
    #40072037
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь

А нельзя ли использовать всё по назначению?...

Богу - богово, а кесарю - кесарево.
Ибо каждый сверчок должен знать свой шесток.

ЗЫ. Только вот не надо путать себя с провидением.
Кто указал тебе предназначение?
...
Рейтинг: 0 / 0
Выравнивание значений
    #40073304
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
" мир человеков не оскудевает всякими извратами ". Кесарь.

Расскажу еще одну историю из своей жизни.

В начале 90-х нам предложили решить задачу управления несколькими десятками однотипных Устройств, каждое из которых должно выполнять свою задачу независимо от остальных. Для этого выделяется ПК, с помощью которого Оператор будет командовать этими Устройствами. ПК соединяется через свой COM-порт с Контроллером, который должен преобразовывать команды в циклограммы: последовательности импульсов, которым повинуются Устройства. Все хорошо, все работает, все довольны.

Через несколько лет, когда начали разрабатывать третью версию системы, приходит коллега и говорит: стоимость Контроллера составляет существенную часть стоимости всей системы, дороговато, сможешь ли ты сформировать эти циклограммы на выходе LPT порта, если выходов и входов на нем хватает? Остальное он берет на себя.

Теперь уже я начал бекать: могу, но ОС не система реального времени, микросекунды можно обеспечить только глупым счетом, гарантируется минимальная длительность импульсов (пауз), максимальная длительность импульсов будет непредсказуемой, да и не царское это дело, есть же для этого Контроллер. Он и должен разворачивать команды в циклограммы. К тому же деньги за новую версию Контроллера уже заплачены. А изменение длительности импульсов в большую сторону критично? Нет, главное, чтобы мы успели за заданное время обслужить все Устройства и не забыть об Операторе, который в самый неподходящий момент захочет покомандовать Устройствами или получить отчет. Попробуем? Я нехотя согласился, будучи уверенным в провале этого дела. Тем более, что в этой версии мы наконец-то решились окончательно перейти от файлов к БД и не всё шло гладко.

Сколько шуток мы породили на тему, что все нормальные (наверно, это синоним слова профессиональные) программисты отлаживают свои программы в отладчике, а эти ненормальные в осциллографе. В итоге, вместо придаваемого к ПК ящика-посредника, появилась одна плата ключей, которая размещалась в корпусе ПК и запитывалась от его же блока питания. Появились две процедуры Out(контакт, значение); Delay(t :время в мкс, k :коэффициент), которая просто считала от 0 до k*t, где k – подбирался (ужас какой!) под конкретный тип ПК и хранился в файле настроек; и одна функция In(контакт, значение). Переписали модуль формирования команд с помощью этих трех примитивов без изменения его интерфейса. Поэтому вся остальная часть ПО не узнала об этом непрофессиональном изменении одной из ее частичек. Я почувствовал себя Властелином этих жалких Устройств! Мне уже не надо вежливо просить Контроллер распорядиться, чтобы вот то Устройство сделало вот это!

Через некоторое время после поставки новой системы, которую мы гордо назвали системой третьего поколения, появилась серьезная проблема: Эксперты Заказчика сказали, что стоимость системы завышена. Посчитали стоимость ПК + стоимость радиодеталей и пришли к выводу, что купили один ПК по цене трех. Эти же Эксперты пообещали Заказчику сделать такое-же за пару недель и дешевле. С учетом этих факторов дальнейшее сотрудничество в этой области с нами прекращается. Дело хозяйское, у нас нет ни одной возможности вставить вам палки в колеса… Вот он, реальный результат непрофессиональных технических решений! А ведь внутренности Контроллера магически влияли на стоимость системы в сторону увеличения! Как объяснить всем о нашем провале?.. Через примерно полгодика мы получили заказ на очередную систему.

С течением времени все меняется: ПК становились 386, 486, …, ОС – DOS, Windows 95. Появилась 2000-я и прямой доступ к портам был перекрыт. Осилили собственный драйвер LPT. Появились сети компьютеров и SQL, стал исчезать LPT. Наше ПО тоже не стояло на месте, но способ формирования импульсов не менялся, увеличивался только коэффициент k. А плату ключей мог отремонтировать любой, кто умеет держать в руке паяльник.

Система прожила более четверти века и сейчас потихоньку заменяется новой, системой четвертого поколения, со стандартным сетевым протоколом. Снова появился ящик-посредник, теперь он называется Коммутатором. И я уже не Властелин этих Устройств, которые стали умнее меня. Теперь я вежливо прошу их сделать вот это. Все развивается по спирали.
Многие отчеты в этой системе формируются примерно так: 20189198 , 17632966 , выводятся в компонент TMemo как обычный текст, который либо отображается на экране, либо сразу печатается без показа на экране. Читая такие вопросы, у меня крепнет чувство, что я не одинок во Вселенной.

Вывод, который я тогда сделал: МОЖНО И НУЖНО ИСПОЛЬЗОВАТЬ ЛЮБЫЕ УЖЕ ИМЕЮЩИЕСЯ ВОЗМОЖНОСТИ И НЕ БОЯТЬСЯ РАЗГОВОРОВ О НЕПРОФЕССИОНАЛИЗМЕ И ИЗВРАТАХ. Позже я узнал, что это частный случай бритвы Оккама: "Не следует множить сущее без необходимости". Принцип, известный философам Древней Греции. Следую ли я этому? Не всегда.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40073456
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l,

ну в указанном примере уже содержится ответ, почему это было неверное решение. Как минимум один клиент отвалился :) Так что извраты конечно допустимы, если припёрло, но надо делать как надо.


Но это не единственная ошибка вашего маркетинга. По уму надо было делать две версии системы. С контроллером и без оного. С разным позиционированием на рынке. "Стабильность vs управляемость", "платите меньше, получаете больше" и т.п.


А вообще все эти истории напоминают легендарный способ делать удалённый ребут зависшему серверу при помощи поставленного напротив кнопки питания сиди-дисковода. Который по команде выезжал и при помощи прикреплённого к передней стенке лотка штырька нажимал на кнопку... И не поспоришь, ведь работало годами.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40073468
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смысл проблемы в том, что форматирование данных на стороне базы накладывает ограничение на клиентское приложение, говоря иначе, такое поведение базы увеличивает связность системы. Для такой базы подходит только _специальный_ клиент, а не любой.
Как раз описанная с контроллером ситуация подчеркивает вред связности, контроллер оказался зависим от типа интерфейса. Если бы связность системы была низкой, то достаточно было бы заменить COM на USB без изменения даже разводки основных плат. Преимущества такого решения очевидны.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40074564
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кесарь,

1.Эта идея была не моей, я был её противником, но только на первом этапе, пока не понял ее перспективы. Это позволило уменьшить затраты на производство системы, а цена продажи не изменилась. И Заказчик, как я сказал, через некоторое время заказал очередную систему. Главное, не бояться посмотреть на ситуацию другими глазами.

2. Спасибо за советы по маркетингу. Поделюсь своим взглядом на маркетинг, брендинг, ребрендинг и прочую современность. К нам часто приходят мальчики и девочки, рассказывающие красивые сказки, как что-то у нас вырастет, если мы примем их стратегию.

В мае этого года исполнилось 28 лет с ввода в эксплуатацию первой такой системы, и я уверен, что через пару лет будем отмечать очередной юбилей. Правила долгожительства простые:

- нужно решать проблему Заказчика и говорить с ним на его языке, а не рассказывать ему, например, о виртуальном поглощении пробелов визуальными элементами управления.

-разумная лицензионная политика. Мы отказались от нее совсем. Экземпляр ПО передается в собственность Заказчика, количество Устройств он может увеличивать, без изменения программы. Часто звонят и просят прислать "лицензии" на наше ПО, которое требуют какие-то органы, мы отвечаем: читайте договор, там написано, что этот экземпляр ПО ваш и вы можете делать с ним всё, что хотите. Это вызывает шок у бухгалтеров и проверяющих, воспитанных на лицензиях их бухгалтерского ПО.

- некоторые функции и отчеты, которые полезны многим, мы делаем и включаем в систему без дополнительных договоров и оплаты, что резко увеличило функциональные возможности системы. Не все способны выбить деньги на автоматизацию своего труда, и много начальников, которым трудно понять, почему этот отчет нельзя сделать вручную за пару минут.

Коллеги-друзья-соперники говорят, что мы демпингуем, а некоторые представители Заказчика говорят, что мы монополисты и дерём с них три шкуры.

- повторюсь, максимально возможное использование имеющихся технических средств. Например, функции контроллера, которые выполнялись его микропроцессором со всем антуражем вокруг этого микропроцессора, были перенесены в ПО, а тот кабель, который связывал Контроллер с Устройствами, теперь подключается к плате ключей. Ключи необходимы, потому что мощность сигналов на выходе LPT недостаточна, и это все, что осталось от hardware Контроллера. При этом даже не пришлось переделывать разъем этого кабеля. На плате ключей было достаточно установить нужную ответную часть разъема.

- не складывайте яйца в одну корзину. Никогда точно не узнаешь, почему одна система взлетела, а другая, более совершенная, была отвергнута.
...
Рейтинг: 0 / 0
Выравнивание значений
    #40074565
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

" ... накладывает ограничение на ... "
В мире на всё накладываются ограничения. Я не видел универсальную лампочку, которая одинаково хорошо подходила бы как к освещению большой комнаты, так и к освещению внутренности холодильника. На мерседесе, даже 600-м, никто не возит бетонные блоки, а на Камазе никто в городе не ездит на работу. Чтобы вывести на заданную орбиту спутник нужна определенная скорость, не ниже и не выше. Зачем придумали столько типов данных, если можно использовать один универсальный? Уже выросло поколение программистов, которым типизация мешает создавать их великие творения. Стандартная ситуация: база данных – запрос – текстовый файл – принтер – бумага. Цепочка отработана, визуализация происходит на бумаге. Что в этой цепочке является "только_специальный_клиент"? Бумага? Да, для каждого типа принтера нужна бумага с определенными характеристиками. Если принтер не может печатать на ватмане, то его место на свалке?

Связность, зависимость . Всё в нашем подлунном мире взаимосвязано и взаимозависимо. Несвязность и независимость существует только в пустых головах молодежи, которая бегает по майданам и площадям с криками и плакатами.

" Если бы связность системы была низкой, то достаточно было бы заменить COM на USB без изменения даже разводки основных плат ".

Сюжет из жизни. Сидим, как-то вечером на работе, обсуждаем создание "специального клиента". Комнату убирает наша уборщица. Метет веником и говорит нам: "Не пора ли идти по домам, а то я вас сейчас обмету веником, и вы не женитесь!". Мой коллега молниеносно ответил: "Эх! Где же вы были 20 лет назад!?".
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выравнивание значений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]