SQVI、SAP查询QUERY都适用于简单的表连接数据查询,但都不能打包传输到PRD,不同环境需要重复创建。可以生成报表程序供T-CODE调用,用se93指定事务码和程序名称。
区别1-权限:
SQVI每个用户创建的query只能自己查看,别的用户看不到,但是通过挂接事务码可以解决。
SAP查询 可以进行权限设置,不存在其他用户不能修改的问题
区别2-使用方式:
SQVI使用单一T-CODE即可实现数据源定义,界面字段选择,过滤字段选择等
SAP查询 分三个 T-CODE ,SQ02(数据源定义);SQ01(界面字段定义等);SQ03(权限管理,用户组创建,用户指定等,不指定权限的话SQ01、SQ02会看不到别人创建的query)
区别3-报表字段调整顺序:
SQVI设计时可指定字段顺序
SAP查询目前了解的情况不可以,但可以通过调整ALV的显示格式实现
区别4-报表显示查询界面:
SQVI所有查询字段都是一堆的
SAP查询貌似一个join表一个屏幕块,格式好看些
SAP查询有时需要修改别人做过的query,但是对方用户组没有对自己设置权限,故此看不到对应的query,甚至连query名都不知道,只知道T-CODE对应的报表名AQ××××××××××××××××之类的,那么怎么找到程序名对应的的query进行修改呢?
目前所知其实程序名有一定规律,如AQ×××××××××YBOD××××,一般YBOD就是query的名称,这样我们可以使用SQ01进入界面,如果出来的界面表格中直接有YBOD名称,那么恭喜你,你有权限看到并修改该query。如果看不到
那么点击菜单 环境——》查询区域,弹出窗体
一般选择标准区,这个要看创建的用户组具体在那个区域,
然后有两个办法,a、完了点击菜单 环境——》用户组(SQ03),随便选个用户组,全然后全退出重进SQ01,看看你想要的query有没有显示出来,没有则重进用户组选别的,再全退出到登录后的界面,再如此类推,一定要注意全退出到初始界面,其实就是用新的用户组看他对应的有权的query。
B、菜单 环境——》功能区(SQ02),貌似所有的都出来,然后查找需要的query,即可
做完报表后,在sq01初始界面,菜单,查询-》其他功能——》可以查看报表名,生成程序,等
query修改过后,需要重新生成程序才能生效
类似如此,琢磨一下就知道了
一定要注意改SQ01时,很多时候需要更改数据源,那就得先改SQ02(数据源)
0.要读一些历史一位IT人员,在这里谈历史,有点不妥,但是我请各位关注一下理查德.费曼,一位全才,在关注一下更猛的沃纳·卡尔·海森堡,一位历史系科班出身的顽童。读一点历史能让你知道一些常识,更能让你明白事情为什么会成现在这个样子。任何事情都是一点一滴积累的,我们现在的即便再发达的科学技术,都是从原始人发明弓箭(并不是常规认为的发明火开始的,如有疑问,私信)开始的。你可能看不起原始人,因为他们没有iPad,没有手机,动不动就咬人...但是我们确实不比他们强多少,我们有iPad,因为苹果做了它,我们有手机,因为有人卖,我们不咬人,不随意打人杀人,因为我们害怕法律的制裁...
任何事情一开始都不是复杂的,其基础理念都是极其简单的。这是我的信条!然后逐步堆积,就成了现在这个样子,然后学子们开始背诵,虽然他们不知道为何如此,但是还是在背诵,然后考试成绩非常好,被认为是高才生,然后,突然有个机会,聚餐,或者年会,抑或相亲,突然听到了重金属摇滚乐,...他们不知所措了,...生活不能自理,...唉,总之,我们是复活的魔鬼,而撒旦就是历史!
1.有类IP和无类IPIP之初,并无此分类,当时的概念全部是“有类”的。只是到了后来,为了解决逐步发现的问题,才引入“无类”的概念,于是就有了这个分类。不用再强调的是,任何事情一开始是都是无法发现问题和不足的,导致到了后来发现时才能弥补,因此技术上的进化都是逐步堆砌而成的,也造成了一项技术会发展进化得越来越复杂。
当人们在实验环境下使用IP可以联网的时候,下一步的计划就是制定一套如何将这些IP地址分发给需要联网的机构的方案,这其实也是当时唯一的问题,因为实验环境中发现的问题都在实验环境中解决了,真实世界的问题只有将IP地址分配出去并且大家都使用了之后才能发现!鉴于此,美国短视且一厢情愿地将IP地址空间分成了5个类,每一个IP地址的“网络号”标示了该IP地址的归属方的规模,其中A类地址的规模最大,C类地址的规模最小,仅仅能承载254台主机。
1.1.子网划分然而使用A类地址的机构并不是很多,A类地址的数量却是如此之多,以至于出现了地址浪费问题,于是分级就成了唯一的解决方案,毕竟地址空间已经划分好,不能推倒重来,那么只能靠分级划分子网了,于是在一个机构的所有IP地址的主机部分,还可以拉出去一部分用来作为子网网络号,这就叫基于分类IP地址的子网划分。于是一个机构中可以承载多个规模相同的子机构,注意是规模相同的!然而这仅仅是裂变的第一步...
1.1.1.问题:为何子网规模必须相同? 子网划分规模必须相同的言外之意就是子网掩码必须一致,这成了有类IP子网划分的硬性规定,但是为何会这样呢?这就不得不从IP路由的另一个维度,即IP管理平面的路由通告上作一番解释。
在有类年代,给出一个IP地址,你就能得到所有的信息,你能得到其主类网段,即x.0.0.0/8的A类网段,y.z.0.0/16的B类网段等,进而你就知道该IP属于什么机构...但是子网划分就是机构内部的事情了,外界并不知道你的机构内部的子网是怎么划分的,对于全局的路由通告而言,当然也不能带有任何子网的信息,也就是说,路由通告只能通告主类网段的路由,并不携带子网掩码!比如RIPv1协议就不能通告1.2.3.0/24这样的路由!那咋办捏?毕竟一个子网就是一个小的网段,在IP路由层次上来讲就是一个真正的三层网段,172.16.1.0/24和172.16.2.0/24虽然都是属于172.16.0.0/16这个主类,但是由于有了子网划分这个操作,它们毕竟不是一个网段!怎么识别并区分它们呢?好办(此时我这么说并不是意味着我就是上帝,我站在一个后来人的角度,采用一种历史的眼光来评述这件事)!就配置在接口上的IP地址的掩码来识别。由于IP地址的配置是独立的,即使现在,IP地址的自动配置也不是常见的事,自动配置大多在端系统!为了不丢失被掩码掩掉的网段,必须要求所有同网段的接口配置相同的掩码,实话说,这是上帝的要求,你可以不遵循,但是你要付出某些主机不可达的代价,,比如,某个接口A配置了172.16.1.0/24的地址,和它通过二层交换机直连的某个接口B配置了172.16.1.128/25的IP地址,那么请问,它们能达到共识吗?对于接口B而言,172.16.1.0/25的就不是同一个网段的,但是对于A而言,所有172.16.1.0/24都是一个网段的,虽然在如今的无类环境中,这完全没有问题,完全可以通过路由的方式解决可达性问题,在有类IP环境中,完全按照主类和“通过配置在接口上IP上的掩码”来识别子网,任何路由协议通告的路由都不会携带掩码,这就成了问题,因此这有类环境中,必须要求子网掩码一致!
这让我想起了小说《猴爪》和基于史蒂芬.金的小说拍成的电影《宠物公墓》(又名《夜半鬼敲门》,有两部)。你希望得到一些逝去的补偿,但是你的代价就是更多的逝去!
为何这么复杂?因为有类IP年代,“IP类”隐含了很多的隐性信息,信息高度的不凝聚!你可以从类中得到很多东西...这并不是上帝的方式。
1.2.无类以及VLSM子网在每个机构被不同程度地划分着,然而仅仅如此划分子网是不够的,第一,一个机构中的子机构不一定规模相同;第二,规模比较大的机构的子机构可能还有子机构,现有的IP地址分配方案无法真实反映实际机构的组织架构关系。
一个分类IP段(即分类IP地址的网络号标示的部分)已经被分配给了一个机构,那么如何来分配该段内的地址是机构内部的事情,为何还要遵循硬性的子网划分规定(划分为规模相同的子王,即子网掩码相同)呢?由于当时做出来的网络设备都是按照当时的“有类”标准执行的,所以其结果阻碍了人们灵活地使用IP地址!
终于,有人大胆地要求取消地址分类,VLSM被提出。如此标准提出后,在无类环境中,子网掩码成了VL(变长)的了,不再是固定的“IP地址的类别指定的掩码+同分类地址段内相同的子网掩码”的了,于是你可以写成IP/mask的形式,IP不再按照基于第一个字节的头几位二进制值而分类,mask也不再遵循8,16,24等基于分类地址的固定划分,事实上,IP可以是任意的符合规定的IP地址,mask如果写成prefix前缀形式(指示多少连续的1)的话,可以是0到32的任意值!实际上,到此为止,裂变已经发生了!
1.3.合并成超网和CIDR取消分类带来了超猛的效果!其中最猛烈的效果就是改变了路由器路由查找的算法,另外改变了人们解读IP地址的方式。对于路由查找算法的改变就是将路由查找进化到了“最长掩码匹配年代”,这个后面要说,对于人们解读IP地址方式的改变,则是在无类环境中,一个块IP地址段不再和唯一的机构关联了,它包含的所有IP地址原则上可以属于任何人,任何机构,可以处在任何物理位置。当然,这也带来了不少的问题,实际上是将IP地址的分配任务交给了实施人员,一旦出现地址空间碎片,将会导致无法汇聚,从而最终导致路由表的条目增加。
有点跑题!正说着无类的好呢,又扯到它的缺点了...言归正传。无类编址的提出实际上最开始是为了解决机构内部分配地址的问题的,然而它事实上却带来了一种副作用,那就是将一块本属于一个机构的地址段可以延伸到该机构之外,也即,机构和地址
最近有个朋友需要提供一个脚本,来获取组织内的用户处于快满的用户列表,并能够10天后根据列表来自动清空他们邮箱数据,代码如下:
#requires -version 2
#脚本撰写人:徐鹏 如果需要脚本的话,请发邮件到10853913@qq.com,为我写脚本创建一些机会,提升更快。
#本脚本分为两个部分执行,一个是计算出当前邮箱用户禁止发送和邮箱被禁用的帐号,另外一个10天后清空邮箱。执行方法如下
#.\analyze-userdata -exportfulluser 主要计算出当前邮箱中满了的部分用户并调用smtp服务器发送给相关人员
#.\analyze-userdata -emptyuser 他会根据10天前生成的文件来自动清空文件中存在用户的邮件
#此脚本的目的大家如果仔细阅读可能就会发现他的功能,就是生成即将被禁止的邮箱,然后发送给管理员,管理员可以在10天之后手动的清空这些邮件
param
(
[switch] $ExportFullUser,
#执行导出命令Dash 符号
[switch] $EmptyMailbox,
#执行清空邮箱命令dash符号
[string] $SmtpServer="tpkhubcasa.tpktest.com",
#默认使用的smtp服务器,如果将来也会发往外部,需要设置邮件服务器的匿名relay 限制
[string] $SendFrom="administrator@tpktest.com",
#设定发件人
[string] $SendTo="administrator@tpktest.com",
#设定收件人
[string] $Helpdeskusermail="administrator@tpktest.com",
#设定桌面支持人员,在用户邮箱无法发送邮件之后HELPDESK
[string] $tmplogpath="c:\TMPLog",
#设定产生日志的路径
$encoding= [System.Text.Encoding]::unicode
#定义邮件编码类型
)
#region Analyze Full user mailbox and send mail to user to tell mailbox full
if($ExportFullUser)
#如果执行exportfulluser则执行如下指令
{
if(!(Test-Path -Path $tmplogpath))
#如果不存在日志产生目录
{
New-Item -ItemType directory -Path $tmplogpath
#新建日志产生目录
}
$UserMailboxs=Get-Mailbox -Filter 'RecipientTypeDetails -eq "UserMailbox"' -ResultSize unlimited
#查询出当前组织内邮箱用户
$useralls=@()
#数组赋初值
foreach ($usermailbox in $UserMailboxs)
#在获取的用户邮箱中轮询
{
$count++
#计数器自加
Write-Progress -Activity "calculating These mailbox now" -Status "calculating now.Please wait" -percentcomplete ($count /($UserMailboxs.count)*100)
#为了让执行过程变得有可看性,也为了更好和用户进行界面接哦互
$userdisplayname=(get-mailboxstatistics -identity $usermailbox).displayname
#获取当前用户的显示名称
$usersamaccount=(get-mailbox -identity $usermailbox).samaccountname
#获取用户的samaccount名称
$usermailaddress=(get-mailbox -identity $usermailbox).primarysmtpaddress
#获取用户的主要邮件地址
$userstatus=(get-mailboxstatistics -identity $usermailbox).storagelimitstatus
#获取用户当前的存储状况
$usermailboxsize=(get-mailboxstatistics -identity $usermailbox).totalitemsize.value.tobytes()
#获取用户当前的用户邮箱大小,并转换成字节
$usermailboxMB="{0:#.##}" -f ($usermailboxsize/1mb)
#根据上面的字节数求出当前用户的邮箱大小,以MB为单位
$userall=New-Object psobject
#新建一个PS对象
if ($userstatus -like "ProhibitSend" )
#用户邮箱禁止发送
{
$userstatus1="您的邮箱将要达到邮箱限制,请您主动删除邮箱中不必要的邮件,不删除可能会对您后续的邮件收发将会造成一定的影响"
#状态赋值
$bodymessage="Dear "+$userdisplayname+":"+"
"+$userstatus1+"
如果对此有疑问,请联系helpdesk,Helpdesk电话为#5566
IT信息部"+(Get-Date -Format "yyyy-MM-dd")
#生成邮件发送状态信息
Send-MailMessage -From $SendFrom -To $usermailaddress -SmtpServer $SmtpServer -Body $bodymessage -Subject "您的邮件即将超过您允许的最大邮件收发限制,为了避免您影响您的收件,请删除部分邮件,谢谢!" -Encoding $encoding
#将邮件发送给客户
$userall| Add-Member -MemberType NoteProperty -Name "samaccount" -Value $usersamaccount
#为userall 的ps 对象添加一个属性,属性名称为samaccount
$userall| Add-Member -MemberType NoteProperty -Name "displayname" -Value $userdisplayname
#为userall 的ps 对象添加一个属性,属性名称为displayname
$userall| Add-Member -MemberType NoteProperty -Name "userstatus" -Value $userstatus
#为userall 的ps 对象添加一个属性,属性名称为 userstatus
$userall| Add-Member -MemberType NoteProperty -Name "usermailboxMB" -Value $usermailboxMB
#为userall 的ps 对象添加一个属性,属性名称为usermailboxMB
$userall| Add-Member -MemberType NoteProperty -Name "usermailaddress" -Value $usermailaddress
#为userall 的ps 对象添加一个属性,属性名称为
$useralls=$useralls+$userall
#将对象赋值给数组
}
if ($userstatus -like "mailboxdisabled" )
#如果用户状态等于Maildisabled状态则执行如下命令
{
$userstatus1="此邮箱已经由于空间使用过大而被Exchange禁用,请主动协助处理此邮箱,谢谢!"
$bodymessage="Dear Helpdesk及系统管理员:"+"
"+"此邮箱用户为:"+$userdisplayname+"的所属邮箱,邮箱地址为"+$usermailaddress+"目前"+$userstatus1
Send-MailMessage -From $SendFrom -To $Helpdeskusermail -Cc $SendTo -SmtpServer $SmtpServer -Body $bodymessage -Subject "以下用户已经由于邮件过多而无法再进行邮件收发,请Helpdesk跟踪,谢谢!" -Encoding $encoding
#发送邮箱告诉helpdesk 及系统管理员邮箱因为过大而无法发送邮件,通知helpdesk人员处理
}
}
$tmplogfile=$tmplogpath+"\"+$(get-date -Format "yyyy-MM-dd")+".csv"
#为创建文件名字做好初值
$useralls| Export-Csv -Encoding default -NoTypeInformation -Path $tmplogfile
#生成符合Probhibit 禁止发送用户列表
Send-MailMessage -From $SendFrom -To $SendTo -SmtpServer $SmtpServer -subject "请检查附件中的超过使用量的用户" -Body "Dear Sir: 请检查附件中超过邮件使用量的用户。如果附件为空,说明没有超过限制的用户。谢谢!" -Attachments $tmplogfile -Encoding $encoding
#发送邮件给管理员当前邮箱即将达到禁止邮箱的名单
}
#endregion
#region Empty user mailbox
if ($EmptyMailbox)
#执行清除命令
{
$lastshowdate=(Get-Date).add